全志uboot添加uart初始化,利用按键检测进入刷机模式

使用芯片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();烧录模式

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值