然后就开始了漫长的裁剪和驱动搬砖了。。。
刚开始时,先移植一个能跑的uboot去测试内存、flash和网络。主频设为168MHz。之所以不将主频拉到180MHz,就是因为USB需要48M的时钟,不能整除180。在84MHz的时钟频率下,cas设为2,内存顺序读写速度大约能到70MB每秒。nand flash读写就有点慢了。至于网卡,焊好了,而且主机不用WiFi的话,tftp是又快又准的。
刚加上网络,内核就猛增到2MB。。。为了测通内核的驱动,内核只能先放在SDRAM上跑吧,到时候弄内核模块再说。奇怪的是,uboot的tftp好好的,内核的网卡初始化就死了。单步调、看寄存器,折腾了许久,发现源码里一个寄存器写错了,以至于mii接口的没问题,rmii的就不行,怪不得eval板子上能用网卡。。
网卡初始化时候没有使能phy芯片。。。
默认配置是
tickless内核,这会导致网卡初始化时候卡死。。。
yaffs的补丁打进去之后编译不过,后来发现是新版内核为解决y2038千年虫问题而去掉了一些接口。。。
USB寄存器配置顺序不对,导致初始化失败。。。
因为在SDRAM上跑的内核性能太低了,USB外接的设备都跑的比stm32快,以至于u盘键盘什么的几乎总是枚举失败。。。
ltdc驱动忘了注册时钟,导致内核最后将ltdc关掉,以至于没有显示。。。
sdio驱动更新了,数据结构变了,然后用不了了。。。
摄像头初始化时候没有使能。。。
。。。
驱动搬好了,内核就爆到快5MB了,然后要想办法裁剪到2MB以下,而且内核的网络是不能模块化的。。。
内核加载模块失败,后来发现是gcc的参数没用长跳转,无法从0x08000000的片内flash跳到0x80000000的SDRAM那里。。。
还有日常hardfault:内存没调好,hardfault;设备树写错了,hardfault;还没进start_kernel(),hardfault。。。
我记得的最吊诡的hardfault是,自己编译的gcc6.4的arm-uclinuxeabi工具链,短跳转的地址算错了,翻了binutils的源码发现新版的as为了支持armv8-m的cpu改了一些东西,导致往前跳的地址多了1,导致PC值为偶数就进入arm模式,然后报用法错误,上访hardfault。。。
也碰到过几次imprecise的bus fault,有的是因为写访问了片内flash,有的是外设寄存器没设好,有的发生在初始化中断向量表时候。。。
这一堆乱七八糟的问题解决了,终于,Linux跑起来了。。。
之前在SDRAM里跑,BogoMIPS是9;在片内flash里跑,BogoMIPS暴涨到110。。。
放不了链接。。。视频请在b站上搜linux-on-stm32
不过回味起来,这只能说业余时间弄的玩具。可以说如今搞自动化的都搞slam,搞计算机的都搞ai,搞系统开发这玩意的早就不那么吃香了罢。