全志A33增加uart接收 汇编层次

全志A33增加uart接收  汇编层次


\a33-dvk3\vendor\softwinner\linux-3.4\arch\arm\kernel\debug.S
/*
 *  linux/arch/arm/kernel/debug.S
 *
 *  Copyright (C) 1994-1999 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 *  32-bit debugging code
 */
#include <linux/linkage.h>
#include <asm/assembler.h>


.text


/*
 * Some debugging routines (useful if you've got MM problems and
 * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
 * references to these in a production kernel!
 */


#if defined(CONFIG_DEBUG_ICEDCC)
@@ debug using ARM EmbeddedICE DCC channel


.macro addruart, rp, rv, tmp
.endm


#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)


.macro senduart, rd, rx
mcr p14, 0, \rd, c0, c5, 0
.endm


.macro busyuart, rd, rx
1001:
mrc p14, 0, \rx, c0, c1, 0
tst \rx, #0x20000000
beq 1001b
.endm


.macro waituart, rd, rx
mov \rd, #0x2000000
1001:
subs \rd, \rd, #1
bmi 1002f
mrc p14, 0, \rx, c0, c1, 0
tst \rx, #0x20000000
bne 1001b
1002:
.endm


#elif defined(CONFIG_CPU_XSCALE)


.macro senduart, rd, rx
mcr p14, 0, \rd, c8, c0, 0
.endm


.macro busyuart, rd, rx
1001:
mrc p14, 0, \rx, c14, c0, 0
tst \rx, #0x10000000
beq 1001b
.endm


.macro waituart, rd, rx
mov \rd, #0x10000000
1001:
subs \rd, \rd, #1
bmi 1002f
mrc p14, 0, \rx, c14, c0, 0
tst \rx, #0x10000000
bne 1001b
1002:
.endm


#else


.macro senduart, rd, rx
mcr p14, 0, \rd, c1, c0, 0
.endm


.macro busyuart, rd, rx
1001:
mrc p14, 0, \rx, c0, c0, 0
tst \rx, #2
beq 1001b


.endm


.macro waituart, rd, rx
mov \rd, #0x2000000
1001:
subs \rd, \rd, #1
bmi 1002f
mrc p14, 0, \rx, c0, c0, 0
tst \rx, #2
bne 1001b
1002:
.endm


#endif /* CONFIG_CPU_V6 */


#elif !defined(CONFIG_DEBUG_SEMIHOSTING)
#include <mach/debug-macro.S>
#endif /* CONFIG_DEBUG_ICEDCC */


#ifdef CONFIG_MMU
.macro addruart_current, rx, tmp1, tmp2
addruart \tmp1, \tmp2, \rx
mrc p15, 0, \rx, c1, c0
tst \rx, #1
//检查mmu是否开启
moveq \rx, \tmp1
//没有开启,使用物理地址
movne \rx, \tmp2
//已经开启,使用虚拟地址(物理地址+0xF0000000)
.endm


#else /* !CONFIG_MMU */
.macro addruart_current, rx, tmp1, tmp2
addruart \rx, \tmp1
.endm


#endif /* CONFIG_MMU */


/*
 * Useful debugging routines
 */
ENTRY(printhex8)
mov r1, #8
b printhex
ENDPROC(printhex8)


ENTRY(printhex4)
mov r1, #4
b printhex
ENDPROC(printhex4)


ENTRY(printhex2)
mov r1, #2
printhex: adr r2, hexbuf
add r3, r2, r1
mov r1, #0
strb r1, [r3]
1: and r1, r0, #15
mov r0, r0, lsr #4
cmp r1, #10
addlt r1, r1, #'0'
addge r1, r1, #'a' - 10
strb r1, [r3, #-1]!
teq r3, r2
bne 1b
mov r0, r2
b printascii
ENDPROC(printhex2)


hexbuf: .space 16


.ltorg


#ifndef CONFIG_DEBUG_SEMIHOSTING


ENTRY(printascii)
addruart_current r3, r1, r2
b 2f
1: waituart r2, r3
senduart r1, r3
busyuart r2, r3
teq r1, #'\n'
moveq r1, #'\r'
beq 1b
2: teq r0, #0
ldrneb r1, [r0], #1
teqne r1, #0
bne 1b
mov pc, lr
ENDPROC(printascii)


ENTRY(printch)
addruart_current r3, r1, r2
mov r1, r0
mov r0, #0
b 1b
ENDPROC(printch)


ENTRY(uart_rev_a_char)
  
  addruart_current r3, r1, r2 
  
  PUSH  {r0-r12, lr} 
  add r2, r2, #0x14
  //LSR REG
  mov r0, r2
  //bl printhex8
  POP  {r0-r12, lr} 
  
  
  1001:
  add r2, r3, #0x14
  //LSR REG
  ldr r0, [ r2 ]
  tst r0, #1
  beq 1001b
  //等待接收串口0一个字符
  ldrb r0, [ r3, #0x00 ]
  //返回接收到的字符
  
  mov pc, lr
  
ENDPROC(uart_rev_a_char)


#else


ENTRY(printascii)
mov r1, r0
mov r0, #0x04 @ SYS_WRITE0
ARM( svc #0x123456 )
THUMB( svc #0xab )
mov pc, lr
ENDPROC(printascii)


ENTRY(printch)
adr r1, hexbuf
strb r0, [r1]
mov r0, #0x03 @ SYS_WRITEC
ARM( svc #0x123456 )
THUMB( svc #0xab )
mov pc, lr
ENDPROC(printch)


#endif








其他说明:
make ARCH=arm  menuconfig




kernel hacking-->CONFIG_DEBUG_LL:                                                                                                  │  
  │                                                                                                                   │  
  │ Say Y here to include definitions of printascii, printch, printhex                                                │  
  │ in the kernel.  This is helpful if you are debugging code that                                                    │  
  │ executes before the console is initialized.                                                                       │  
  │                                                                                                                   │  
  │ Note that selecting this option will limit the kernel to a single                                                 │  
  │ UART definition, as specified below. Attempting to boot the kernel                                                │  
  │ image on a different platform *will not work*, so this option should                                              │  
  │ not be enabled for kernels that are intended to be portable.                                                      │  
  │                                                                                                                   │  
  │ Symbol: DEBUG_LL [=y]                                                                                             │  
  │ Type  : boolean                                                                                                   │  
  │ Prompt: Kernel low-level debugging functions (read help!)                                                         │  
  │   Defined at arch/arm/Kconfig.debug:88                                                                            │  
  ├───────────────────────────────────────────────




实现效果:


ch = uart_rev_a_char();
printk( "\nrev char = %x.\n", ch );


shell@astar-dvk3:/sys/devices/platform/uart.0 $ cat debug_info                 


rev char = d.


cat debug_info                 


rev char = 39.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值