为了在uboot下使用c串口2做了一下修改
1.在配置文件文件中添加
/*
* NS16550 Configuration
*/
#define CONFIG_SERIAL_MULTI 1
#define CONFIG_SYS_NS16550
#define CONFIG_SYS_NS16550_SERIAL
#define CONFIG_SYS_NS16550_REG_SIZE (-4)
#define CONFIG_SYS_NS16550_CLK (48000000)
#define CONFIG_SYS_NS16550_COM1 0x48020000 /* Base EVM has UART0 */
#define CONFIG_SYS_NS16550_COM2 0x48022000
#define CONFIG_SYS_NS16550_COM3 0x48024000 //支持uart2
2.在mux.h中修改
我用的引脚是GP1[19]=51,GP1[20]=52
/* -116 */ BIT(5), BIT(5), BIT(6), BIT(6),
3.在evm.c中
void per_clocks_enable(void)
{
u32 temp;
__raw_writel(0x2, CM_ALWON_L3_SLOW_CLKSTCTRL);
/* TODO: No module level enable as in ti8148 ??? */
#if 0
/* TIMER 1 */
__raw_writel(0x2, CM_ALWON_TIMER_1_CLKCTRL);
#endif
/* Selects OSC0 (20MHz) for DMTIMER1 */
temp = __raw_readl(DMTIMER_CLKSRC);
temp &= ~(0x7 << 3);
temp |= (0x4 << 3);
__raw_writel(temp, DMTIMER_CLKSRC);
#if 0
while(((__raw_readl(CM_ALWON_L3_SLOW_CLKSTCTRL) & (0x80000<<1)) >> (19+1)) != 1);
while(((__raw_readl(CM_ALWON_TIMER_1_CLKCTRL) & 0x30000)>>16) !=0);
#endif
__raw_writel(0x2,(DM_TIMER1_BASE + 0x54));
while(__raw_readl(DM_TIMER1_BASE + 0x10) & 1);
__raw_writel(0x1,(DM_TIMER1_BASE + 0x38));
/* UARTs */
__raw_writel(0x2, CM_ALWON_UART_0_CLKCTRL);
while(__raw_readl(CM_ALWON_UART_0_CLKCTRL) != 0x2);
__raw_writel(0x2, CM_ALWON_UART_1_CLKCTRL);
while(__raw_readl(CM_ALWON_UART_1_CLKCTRL) != 0x2);
__raw_writel(0x2, CM_ALWON_UART_2_CLKCTRL); //使能UART模块
while(__raw_readl(CM_ALWON_UART_2_CLKCTRL) != 0x2);
while((__raw_readl(CM_ALWON_L3_SLOW_CLKSTCTRL) & 0x2100) != 0x2100);
.......
}
4.使用uart2流程
1>首先调用eserial2_init();函数
2>调用_serial_putc(0x01,0x03); //第一个参数是要发送的数据,第二个参数是串口号
现在的情况是发送两个字节以后在ns16550.c中会死在下面的函数中
void NS16550_putc (NS16550_t com_port, char c)
{
while ((serial_in(&com_port->lsr) & UART_LSR_THRE) == 0); //会始终等待发送完成,死在了这儿
serial_out(c, &com_port->thr);
}
ns16550.c这个文件没有修改
我还试了试串口1,没有出现这个情况。另外我还将u-boot.min.nand重新编译了再烧到flash中也不行
请问有没有遇到过相似情况的,没有头绪啊