使用芯片A40i
参考手册 Allwinner_A40i_User_Manual_V1.1.pdf
编写uart初始化寄存器参考此处
不同串口寄存器首地址及描述
检测函数如下:
static int detect_keyboard(void)
{
int bootdelay = 1;
int abort = 0;
char head;
char local_addr;
char local_data;
char local_act;
char crc;
char tail;
unsigned long ts;
//该流程依据为Allwinner_A40i_User_Manual_V1.1.pdf中8.3.4 Programming Guidelines,8.3.5 Register List以及8.3.6 Register Description。
writel(0x00090001, 0x01c2006c); //打开串口3 CCU时钟使能 该寄存器[23:16]位对应UART7-0的时钟使能
writel(0x00090001, 0x01c202d8); //关闭串口3软件复位 寄存器[23:16]位对应UART7-0的复位使能
writel(0x33333344, 0x01c208fc); //将PH0,PH1复用为串口3
writel(0x00000002, 0x01c28ca4); //将0写入UART_HALT[1],使能CHCFG_AT_BUSY
writel(0x00000080, 0x01c28c0c); //使能DLAB,将0x01c28c00切换为UART_DLL寄存器
writel(0x00000001, 0x01c28c00); //115200将0x0000000d写入UART_DLL,串口时钟24M,自带16分频,24000000/16/115200=13 1.5M将0x0000000d改为0x00000001
writel(0x00000000, 0x01c28c04); //将0写入UART_DLH
writel(0x00000000, 0x01c28c0c); //失能DLAB,将0x01c28c00切换为UART_RBR寄存器
writel(0x00000013, 0x01c28c0c); //设置uart3_lcr,8位,无校验,1位停止位
writel(0x00000004, 0x01c28ca4); //将1写入UART_HALT[2]更新变动,等待UART_HALT[2]自己复位
while(((readl(0x01c28ca4)) & 0x00000004) != 0);
writel(0x000000c1, 0x01c28c08); //使能并复位TX/RX FIFO
writel(0x00000005, 0x01c28c04); //使能TX/RX中断
printf("Hit any key to enter efex: %2d ", bootdelay);
while((bootdelay > 0) && (!abort))
{
--bootdelay;
/* delay 1000 ms */
ts = get_timer(0);
do {
if ((readb(0x01c28c14) & 0x01) != 0)
{
/* we got a key press */
head = readb(0x01c28c00); //读取UART_RBR
if(head != 0xFA) continue;
while((readb(0x01c28c14) & 0x01) == 0);
local_addr = readb(0x01c28c00);
while((readb(0x01c28c14) & 0x01) == 0);
local_data = readb(0x01c28c00);
while((readb(0x01c28c14) & 0x01) == 0);
local_act = readb(0x01c28c00);
while((readb(0x01c28c14) & 0x01) == 0);
crc = readb(0x01c28c00);
while((readb(0x01c28c14) & 0x01) == 0);
tail = readb(0x01c28c00);
if(head == 0xFA && local_addr == 0x01 && local_data == 0x05 && (local_act == 0x0A || local_act == 0x0B) && (crc == 0x52 || crc == 0x5B) && tail == 0xAF) //按下2ND为FA,01,05,0A,52,AF,松开2ND为FA,01,05,0B,5B,AF/*自定义按键数据帧*/
{
abort = 1; /* don't auto boot */
bootdelay = 0; /* no more delay */
sunxi_board_run_fel(); //efex
}
break;
}
udelay(10000);
} while (!abort && get_timer(ts) < 1000);
}
return 0;
}
说明:以下三种方式可以进入烧录模式
短接fel及gnd进入烧录模式
linux 输入 reboot efex进入;
uboot阶段利用sunxi_board_run_fel();烧录模式