x210-2023-03-20

1、先前移植好的uboot由于是从uboot官网下载一步一步改出来的,所以第一个问题会发现无法保存ENV(通过测试setenv和saveenv bootdelay参数即可知道,saveenv失败,不过MMC0还是能识别到的),另一个问题是没有把DM9000网卡驱动做进去(传输kernel得用tftp服务,后面移植根文件系统大概率需要使用到nfs,用于边改边看挂载点的变化,不过这点就需要开启内核的nfs支持才可以了反倒和uboot关系不太大),其余问题像需要修改默认400MHz时钟至1000MHz、没有打印各时钟频率具体信息等,这次针对的是第一个问题,主要完成MMC驱动移植并能实现ENV参数保存(后面移植发现还需要做多一步保存ENV到特定扇区17,这个相对简单不赘述),芯片平台为S5PV210,uboot源码是2012.10版本的,移植用到的源文件譬如mmc.c、s3c_hsmmc.c等取自三星android_uboot_smdkv210.tar.bz2(其实可以直接从三星评估板所用uboot开始而不必从裸uboot开始,但是由于前面学习过程已经从裸uboot开始并得到了半成品所以选择补充未完成功能然后继续使用)。

首先是第一次移植,结果是没有移植成功,总结来看,问题出在,一次把多个移植步骤都做了(因为网上参考的文章大多数是一些网友已经移植过后的总结,所以他们的文章往往会告诉你后续步骤,所以自然而然地多做了),导致出的错误多,并且有些错误属于连环扣,其实可以不用处理,但是必须要找到真正的错误点入手改正,其余相连的错误也能一起消除,但是由于前面提的原因,导致众多错误混杂在一起,可能结果是改不完,或者改的时候发现有些错误就是死胡同(譬如提示有个系统头文件出了错,但是这个头文件明明都没改动过而且是源码本身自带的,怎么可能有错,但编译之后的确就指向这个文件有一堆错误)。

接着是第二次移植,这次的思路是先找出最基本的init入口函数(一般仅由几个函数构成),然后从第一个函数开始找其所在源文件,然后拿过来放到需要被调用的文件同层文件夹中,根据编译提示逐个解决然后再进行下一个函数或者文件的移植,经过第一次移植的摸索,除了要在配置文件开启或定义宏内容之外,会发现必须要注意到有些源文件会有头文件(有头文件的需要一起配套移植,不过一般需要放到源码包顶层目录底下的include文件夹,而不是放到被调用的文件同层文件夹,查看是否有配套头文件可以在sourceinsight的project file list中看),而有些文件譬如cmd_mcc.c则是没有配套头文件,那么拿过来之后只需要在Makefile中添加好.o依赖确保文件能被编译进工程即可;另外,sourceinsight这次通过relation window查看函数的被调用树依赖变得比较逊色了,因为一个同名内容有很多个文件或板子都包括有(并且sourceinsight中根据提示错误字符串搜索时要注意,还原通配符内容才有可能搜索得到错误的出处,譬如raise:Signal #8 caught就要写成raise:Signal #%d caught才能放进搜索框),而通过ubuntu的uboot源码包grep -nr查找反而更方便,下图是根据cpu_mmc_init()移植完之后的现象。

2、移植完mmc.c后,如下图所示,当然期间也已经处理完了cmd_mmc.c的移植,但是会发现在MMC部分的打印信息多了raise:Signal #8 caught,网上查了基本说是timer或者时钟配置部分的问题(也就是被除数不能为零需要修改timer.c或者可能没有配置成最佳的时钟频率等),改过timer.c发现不行,所以接下来就是配置成1000MHz,看能不能解决问题,但是尝试过移植三星评估板源码包里的system_clock_init,会发现需要删改,因为有一部分内容是相同的只是针对的板子不同而已,而且有些宏需要自己手动展开放到汇编代码里头去,要不然就只能包含所依赖的头文件,但是无论是自动展开还是通过包含头文件的方式都相对麻烦,再一种方式就是用网上整理好的汇编文件,直接.global把标号声明到外部然后调用,但是结果都是到UART和DDR初始化信息打印完就没再继续往下跑。

 3、由于前面尝试无果,所以使用自带的system_clock_init调用,先测试800MHz确实能跑下来,然后改成1000MHz的,但是实际显示现象就是和原来没有变化,所以应该不是时钟问题导致的;再接下来,补充了缺少的MMC相关宏到s5p_goni.h主配置文件,因为一开始追踪代码没查到是哪的问题,后面实在没思路了于是去搜索MMC驱动移植这几个关键字,通过看文章获得的思路提示到其实自己移植过程中有些宏没定义上(恰好移植编译的过程并没有出错提示这方面的信息,所以比较难发现少定义了),譬如USE_MMC0、MMC_MAX_CHANNEL等,添加好以后再编译烧录就得到下图所示。

 4、EXT_CSD问题的解决办法网上有,解决完发现已经可以保存参数了,不过可以看见在没有进行第一次参数保存设置会有一个bad CRC警告,当经过第一次参数保存设置之后这句警告就再没出现了。

 

 

 5、最后,要补充说一些内容,就是解决s3c_hsmmc.c和setup_hsmmc.c移植过程,会发现从三星评估板移植过来的文件用到了一个和现在uboot某个相同名字的头文件,也就是头文件冲突,但是打开发现其实这个头文件hardware.h只是名字相同但存放路径在uboot下并没有,所以只需要在uboot下创建好路径并放进去即可;使用saveenv能保存ENV参数以后需要多尝试几次看是否也能保存;还有就是每次在对一个文件或者一个特定问题进行解决、修改之前,一定要复制备份好一份再开始。

 

posted @ 2023-03-20 22:32  migui  阅读(26)  评论(0编辑  收藏  举报