非棒子处理器 linux内核移植笔记

来源:互联网 发布:域名的dns怎么设置 编辑:程序博客网 时间:2024/04/20 23:18

不具体贴代码了,这里记录思路和调试过程。交代一下背景:

处理器:我司几年前的一款基于COTEX A9 八核处理器。

移植原因:先前部门只制作了efi引导linux,没有使用uboot,另外因为没有给内核负责部门预算,他们不提供任何支持,甚至部门老大也不让员工私下提供支持。


移植uboot当然是小菜一碟,因之前在使用相同指令集的另一颗处理器上各移植了两个bootloader。没有大的改变,比较关注的flash、内存及系统控制寄存器基地址没有改变。所以基本上按部就班修改一下串口,定时器,网口等接口。问处理器部门要了一份pll和ddr初始化脚本,仿真器跑了一下,没问题,由于此款芯片有sram,就不用像移植上颗芯片那么蛋疼,于是将pll及ddr的初始化从设置大小端的位置向后移植到lowleve。s建栈后的c代码中。

ARMV7相同部分不提了,串口部分在初始化后可以一次打一个字符,然后初始化完控制台print还不能用,因为print中调用循环putc及定时器的等待,所以保证定时器初始化正常。解决定时器初始化问题,就可以跑到uboot shell,接下来比较重要的是调试网口,按照手册搞了下,没用多长时间搞定。


移植uboot已经不再话下,但是内核可没移植过,中软移植对我们不公开代码,linux嘛,有啥好隐瞒的。处于好奇和移植的时候大家总担心uboot传入的参数不对,我主导了这件事。

做的第一件事,在uboot启动操作系统的最后一个文件bootm中,将所有tag全部打印出,眼看tag地址和manid送入内核,想让uboot撇清干系。但是,linux 硬是在打印完成解压缩后,打了一些now,boot the kernel,之后串口就再也没有消息返回。。。。


通过分别在内核解压缩的head.s和启动的head.s中加断点,确定确定板子启动到的地方,之后又分别在kernel_start(),init()加断点,发现其实单板一直在跑,但是跑到一个很厚的地方会出现异常。加printk没有打印,后来确认内核在tty设备初始化之前只是往一个全局变量log_buf方字符串,却不会又任何打印,查阅大量文献,我意识到printascii是解决调试阶段的关键手段,经过几天的努力,终于成功借用printascii成功打印。首先在内核中增加kernel_low_level_printk等2项配置,关闭多处理器选项,后来发现还是没有打出来,于是在head.s中开启mmu前后的汇编代码前后调用ptintascii,发现前面都没有打印,说明,和映射无关,应该是工具还有地方没有配置起来。然后再printascii的汇编代码中加断点,发现指针进来后根本没有调用打印的语句,后发现配置uartaddr这个宏根本没有起作用,进而发现有个某种仿真器的代码配置项导致不会编译uartaddr。去掉后,head.s可以打印,去掉所有断点,代码唰的一下跑了很远,直到devtmpfs地方移植循环panic。


第二天晨会,描述了之前的现象,身边一个同事说devtmpfs我们没有用,之前是用的busybox的工具做的。ok,。config干掉,又跑到挂接文件系统的地方挂掉。改了下中软提供的编包工具,内核增加jffs2的相关支持(具体配置网上有很多),开始发现起不来。后来仔细查看log发现之前传的initrd加放的地址超过了自限定的128MB空间,于是调整几次位置,ok,成功引导ramdisk。接着我们修改uboot启动的环境变量,init=/sbin/init  rootfs=/dev/mtdblock10;又增加对norflash驱动支持,ok,jffs2文件系统启动ok。


说起来容易,实际调试还有有很多反复和尝试。包括一开始timer0不能初始化,使用其他timer等等问题。

总的来说,如果不算printascii花的时间,内核移植要比uboot简单,只是配置多点,但是网上资料更多,因为内核与具体外设关系还要少点,设计硬件网上资料多讲的事棒子芯片多点。终于搞定了,我大中华威武!

0 0
原创粉丝点击