本帖最后由 caizhiwei 于 2024-4-2 17:12 编辑
#申请原创# #每日话题# @21小跑堂@21ic小喇叭 @21小跑堂
1. 问题背景目前使用web在线升级时经常出现驱动加载失败问题。 经定位,只有驱动文件和内核相匹配才能成功加载驱动,而web在线升级时所制作的升级包firmware.zip中包含ubi压缩包,ubi压缩包默认只包含有驱动文件(.ko文件),不包含内核镜像zImage,这会造成只升级驱动,不升级内核的情况,一旦升级的驱动和原有的内核不匹配,就会出现驱动加载失败的问题。 2. 解决方案前面提到升级包中的ubi压缩包中默认包含有驱动文件,这些驱动文件来自于comsys仓库ubi_root/local/modules目录,驱动文件属于编译后的产生物,放在git仓库中本身不是上上选,还容易出现只升级驱动,不升级内核,导致驱动内核不匹配的问题。 考虑到ubi是增量升级,而且一般情况下只进行应用升级,这说明一个设备如果可以进行ubi升级,那么这个设备在进行ubi升级之前肯定是已经有了一套匹配的内核和驱动。此时如果只需要进行应用程序升级的话,就不需要将驱动文件打包到ubi中。基于此,从git仓库中删除驱动文件,即删除comsys仓库中ubi_root/local/modules目录。 git仓库中删除驱动文件之后,接下来分析SD卡卡刷升级和内核驱动在线升级的问题。 2.1 SD卡卡刷升级1) 原始SD卡卡刷包如下所示:
这种形式zImage来自于内核编译后的成果物,而ubi.tar.gz中的驱动来自于git仓库中所保存的,可能存在滞后的问题,这种内核和驱动来源不一致的情况就容易导致不匹配问题。 2) 修改后SD卡卡刷包如下所示:
变更影响点:需要各位注意,在SD卡卡刷包更新zImage时,务必同时更新对应的驱动文件。 关于更新SD卡卡刷包中ubi.tar.gz以外的其余文件时,此处提供两种获取方式: 方式1:自己下载a6g2c_wb128li_image仓库进行编译,编译后的成果物都在target目录下,如下图所示:
注意:dtb文件不要弄错了,30|60|180|360 编译选项生成的dtb文件都叫做dh180_a6g2c-wifi-bt-128m.dtb这个名字 方式2(建议):直接去ci归档路径下寻找编译后的成果物,成果物已经直接以sd卡卡刷包的形式归档。ci会持续集成,每日都会编译出最新的版本,默认会保留7天以内的版本,可以按照编译日期获取某一次的ci版本。 建议使用该方式,一来可以节省自己编译内核的时间,二来可以同时帮助检查最新的版本是否存在基本功能问题。有可能你本来就没有下载m6g2c_burn_script.bat的权限,此时也只能使用该方式了。
2.2 内核驱动在线升级(待实现或验证功能)在线升级是指通过web页面,上传firmware.zip包升级。需要保证升级内核或者驱动时,所制作的firmware.zip包务必同时包含zImage和对应相匹配的驱动文件(保证来源一致)。有两种升级方式: 1) 方式1:同时升级内核、驱动、应用程序 该情况下,可以考虑同时将zImage、驱动文件(单独目录存放,不要放在ubi.tar.gz种、具体存放方式待功能实现后确定)、ubi.tar.gz等打包在firmware.zip文件中。 需要注意firmware.zip不能太大,这种适合应用更新包比较小,并且需要同时更新内核和驱动的情况。 2) 方式2:单独升级内核和驱动 该情况下,只需要将zImage和对应的驱动文件(.ko文件)一起打包到firmware.zip之中即可。 综上所述:如果希望通过在线升级的方式升级内核或者驱动,不管是方式1还是方式2,都需要保证内核文件zImage和驱动文件同时进行打包,并且保证zImage和驱动文件是相匹配的。 如果升级包中只有zImage或者只有驱动文件,升级程序会避免进行内核和驱动升级。但是如果升级包中既有zImage又有驱动文件,在升级之前是无法判断内核和驱动是否匹配的,因此,就需要保证制作升级包firmware.zip时zImage和驱动文件是相匹配的(来源一致)。
|
从发现问题,定位问题再到解决问题,一文解决了A6G2C系列IoT核心板内核驱动升级匹配问题