之前修改OK6410-A开发板的调试打印串口还是在的时候了,最近项目又用到,网上还是没有详细的说明资料(WinCE的还是有一些资料),当初要是做好笔记就好了。。。没办法,又折腾了一天时间,终于可以了,这次记下来吧。
话说为什么非得改掉串口0呢,S3C6410用户手册里是有说明的:
可见串口0和串口1具有16字节的FIFO,且通过 nRTS 和 nCTS 信号支持自动流量控制,比另两个串口更强大,这样的串口作为调试打印用有些浪费了,下面就尝试把打印串口改为串口3吧。
首先分析Uboot的lowlevel_init.S文件,这里面有串口的底层初始化函数uart_asm_init,不熟悉的可以参考我上一篇博文OK6410开发板Uboot学习总结----(一)Uboot启动分析
这主要是对UART0和UART1的GPIO进行配置,因为很多GPIO都是复用的,结合手册分析就清楚了(最好看英文手册,无奈英文不好啊,这里就偷懒看中文的吧):
由手册可知,要配置为串口GPA0、GPA1都得是2,而中间的GPA2、GPA3没有配置,后面串口1的配置一样,所以给r1的值是0x220022。再看串口2和3的寄存器:
由于串口2和3的寄存是挨着的,没有CTS、RTS的配置项,所以给GPBCON的值应该是0x2222(之前看过Real6410的开发板,配置成0x1122了,所以串口3有问题)。
四个串口的GPIO的配置好了,下面就该配置串口了,继续往下看代码:
这里找到地址0x7F005000,还是看手册:
可见这是UART0通道行控制寄存器ULCON,UFCON_OFFSET宏的值是0x80,偏移后对应的寄存器是UART0 FIFO控制寄存器,这里赋给0实际就是默认值禁止FIFO;UMCON_OFFSET宏的值是0x0C,偏移后对应的是UART MODEM控制寄存器,实现FIFO流控制,当然也被禁止了。寄存器分布如下:
最后把3赋给ULCON寄存器是什么意思呢?ULCON0寄存器定义如下:
实际就是对ULCON0寄存器操作,配置传输方式为8bit,1位停止位,无奇偶校验。
下面是对时钟的配置代码:
这是对串口0的时钟配置,大家可以结合手册自行去分析。再之后?函数结束了,其他串口时钟配置在哪里啊!!!
想起来上次分析的board.c文件里start_armboot函数中也有个串口初始化的函数serial_init,看看它里面是不是有后续的初始化呢。serial_init函数在uboot1.1.6\cpu\s3c64xx\serial.c文件中定义:
额,实质上这里并没有进行有用的配置,只是简单循环一下。再看上面的宏定义:
选择哪个调试串口是由CONFIG_SERIALX(X为1-4)宏决定的,还必须得设置一个。改一下试试吧,修改uboot1.1.6\include\configs\smdk6410.h文件中:
按照分析定义CONFIG_SERIAL4宏,然后编译Uboot源码,烧进去再运行,果然串口3不行啊。只能自己在uart_asm_init函数中写汇编代码进行初始化串口3了,其实也简单,仿照串口0的代码写就好了:
其实只要把起始地址改为0x7F005C00就可以了,其他的几乎没变,改好后保存。这次编译完下载进去就看到Uboot的启动信息在串口打印了。
打印的还是飞凌的信息,大家想要DIY,这部分可以在uboot1.1.6\cpu\s3c64xx\s3c6410\speed.c文件中修改:
那还有一个问题,命令提示符还是SMDK6410,在哪定义的呢,看main_loop函数处理命令那部分:
len = readline (CFG_PROMPT);
readline的参数就是命令提示符,CFG_PROMPT宏定义在uboot1.1.6\include\configs\smdk6410.h文件中:
都改为自己喜欢的吧,还有一个问题,Uboot使用串口3了,Linux也得使用串口3啊,修改下传递给个内核的参数,也在smdk6410.h文件中:
把原来的ttySAC0改为ttySAC3就可以了,然后烧写进入试一下吧:
卡在这里了,解压内核的信息没有了。。。传递的参数没起作用吗,看来得分析下内核启动(这里不展开说了,以后有机会专题说吧)。分析linux-3.0.1/arch/arm/plat-samsung/include/plat/uncompress.h文件:
里面定义了CONFIG_S3C_LOWLEVEL_UART_PORT宏,必须修改这个宏才能打印内核解压信息,修改内核解压参数,在终端输入make menuconfig命令配置内核:
把上面的选项改为3就好了,编译后在linux-3.0.1/arch/arm/boot目录下生成zImage,替换掉SD卡里面的内核文件,烧写后再启动:
终于出现解压内核的信息了,这时候Uboot的传给内核的启动参数console=ttySAC3才会起作用的。至此Uboot和Linux打印信息都改为串口3了,但是使用SD卡烧写程序的时候,还是使用串口0输出的,要想也改为串口3,得重新制作SD卡里面的mmc.bin文件。这个在后面的“OK6410从SD卡启动分析”专题再详细说吧,毕竟一篇文件太长了怕你们懒得看完,嘿嘿。。。
补充
上次修改串口0为串口3,使用基本正常了,可今天测试串口0时突然打印出一句:
Try to bring eth0 interface up......
怎么还有调试信息输出啊,再次核对了一下,内核调试串口已经修改正确了。最后终于发现罪魁祸首了,在 etc/init.d/ifconfig-eth0文件中:
我也是醉了,这里面直接写给串口0了,再查查文件系统里的其他文件吧,要有类似的输出也得记得改过来。。。