【移植Linux 3.4.2内核之四】修改内核代码支持YAFFS文件系统

上一篇文章,我们从0制作jffs2文件系统,因为我们的内核本身就支持iffs2文件系统,但是它不支持yaffs文件系统。今天我们就来修改内核代码,让内核支持yaffs文件系统的格式。


1.首先我们获取yaffs源码

我是通过git获得,当然源码获得的途径很多,需要源码的可以加我最底下的联系方式。
在Linux系统中,输入:
git clone git://www.aleph1.co.uk/yaffs2
获取到源码,将源码放到的/work/system/yaffs目录下,然后解压。

当你拿到任何一个源码,不管是什么源码,里面都会有类似README这样的文档,我们第一个需要看的文档就是这个文档,文档里会教我们接下来该如何做,那么我看过文档后,就知道该如何做了:


2.首先给内核打补丁:
进入到yaffs源码目录:
cd /work/system/yaffs/yaffs2
使用下面的命令进行打补丁:
./patch-ker.sh c m /work/system/linux-3.4.2 (注意后面是我的内核源码的目录)
打完补丁后,就会在内核的/fs/yaffs2目录下加入了我们yaffs的源码


3.配置内核支持YAFFS:
输入:
make menuconfig
依次选择:

File systems  ---> Miscellaneous filesystems  ---> <*>   yaffs2 file system support 

然后保存配置。重新编译内核:
make uImage
编译没有通过,如下:
这里写图片描述
遇到错误不要怕,一个一个解决,我们先把fs/yaffs2里面的源码都加到我们windows系统里的linux内核的source insight源码里,去看yaffs源码。下面我们一个一个解决错误。

首先是这个错误:fs/yaffs2/yaffs_vfs.c:2514: error: ‘struct mtd_info’ has no member named ‘sync’
错误显示mtd这个结构体没有sync这个成员:

    if (mtd->sync)mtd->sync(mtd);

去看这个结构体中看发现有这个成员:void (*_sync) (struct mtd_info *mtd);,只不过前面加了一个下划线,我们把下划线加上:

    if (mtd->_sync)mtd->_sync(mtd);

然后重新编译内核,还是有一大堆错误,但是刚才那个错误已经没有了,现在的错误为:
fs/yaffs2/yaffs_vfs.c:2702: error: ‘struct mtd_info’ has no member named ‘erase’
这里写图片描述
通过刚才那个错误,我们知道,这些成员前面都应该有下划线,而我们的错误里的成员,都没有加下划线,下面我们把下划线都加上。
然后重新编译,又发现了一些没有定义的成员,还是没有加下划线,我们一一给加上,然后重新编译:
这里写图片描述
好了,现在的错误就不是那个下划线的问题了。

现在的第一个错误:fs/yaffs2/yaffs_vfs.c:2967: error: implicit declaration of function ‘d_alloc_root’
没有定义d_alloc_root这个函数,可能是新内核里把这个函数给去掉了或者改了,通过搜索关键字s_root得知是改成这个函数了:d_make_root(inode),我们把它换了:

root = d_make_root(inode);

重新编译内核:
这里写图片描述
显示的错误为:fs/yaffs2/yaffs_mtdif.c:42: error: ‘struct mtd_info’ has no member named ‘erase’
还是那个结构体成员的下滑线的问题,加上下划线。然后重新编译内核,发现显示的错误还是那个结构体下划线的问题,这个我就直接改,不放图了。改完后再重新编译,出现的关于那个结构体的错误,一一改掉就行。最后编译终于成功了!!!


4制作yaffs文件系统系统映像
之前我们已经做好了文件系统,现在来制作yaffs文件系统映像:
mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2


5.烧写YAFFS文件系统映像
在uboot中:
nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 $filesize


6.烧写新内核启动
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_yaffs
bootm 32000000
发现启动不了。

要么是uboot有问题,要么是yffas文件系统有问题。通过重新烧写老的uboot,发现可以正常启动,所以现在的问题应该是新的uboot的问题,看来是之前移植的uboot没有移植好。那么我们只能看一下uboot源码了。

我们移植的新UBOOT有BUG:
drivers\mtd\nand\Nand_util.c

    if (!need_skip && !(flags & WITH_DROP_FFS)) {
改为if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) {

然后重新烧写uboot,文件系统,内核,启动一切正常,完毕!!!

7.制作内核补丁
最后我们将移植好的内核,生成补丁,方便以后的使用:
cp .config config_ok
make distclean
mv linux-3.4.2 linux-3.4.2_100ask
tar xjf linux-3.4.2.tar.bz2
diff -urN linux-3.4.2 linux-3.4.2_100ask > linux-3.4.2_100ask.patch

8.如何打补丁:
patch -p1 < ../linux-3.4.2_100ask.patch
cp config_ok .config
make uImage

9.重烧整个系统
我们的uboot,内核,文件系统,都做好了,下面重新烧写整个系统,走一下流程:

使用jtag工具烧u-boot_new.bin
或使用uboot来更新自己: tftp 30000000 u-boot_new.bin; nand erase.part u-boot; nand write 30000000 u-boot
启动uboot,用它来烧写内核(内核变小后,就烧写到NAND里面了,现在启动的地址是30000000,以前是32000000)、FS
tftp 30000000 uImage_new; nand erase.part kernel; nand write 30000000 kernel
tftp 30000000 fs_mini_mdev_new.yaffs2; nand erase.part rootfs; nand write.yaffs 30000000 260000 $filesize
或者使用nfs,相关命令上面都有。

设置参数
set ‘nand read 30000000 kernel;bootm 30000000’
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
set machid 16a
save

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于dhtmlxScheduler的使用说明(ADD EDIT DEL,自定义CelendarBox)

由于比较多朋友询问我的使用问题&#xff0c;所以写一篇简单的使用说明&#xff1a; 可以看回以前相关的文章&#xff1a; 基于dhtmlxScheduler的个人计划... 探讨:OA系统的设计问题. weebox[ PopUp - 弹出窗 对话框 ]weebox是一个基于jquery的弹窗插件dhtmlxScheduler[ Cale…

【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录一移植驱动程序心得体会二移植LCD驱动程序记录三移植按键输入子系统驱动程序四移植触摸屏驱动程序五移植USB驱动程序今天移植了按键&#xff…

idea 解决jar 的冲突

1.maven 组件会自动去除重复的jar 注意&#xff01;灰色是去重的jar &#xff0c;实体颜色是使用的jar; 2.springboot 关于 Class path contains multiple SLF4J bindings.警告的解决 2.1查询jar的依赖结构: 查询出slf4j-log4j12 查询到然后执行exclude https://blog.csdn.ne…

永远要跟比你更成功的人在一起

永远要跟比你更成功的人在一起 (本文只有在月09日可以学习到。) 在你的朋友圈中&#xff0c;如果你是最成功的那一个&#xff0c;你就不会更成功了。 别怕与大人物打交道。最成功的人都是那些最容易与别人相处打交道的人&#xff0c;当你总是与最顶尖的人在一起时&#xff0c;你…

UML 模型

1.五分钟读懂UML类图 https://blog.csdn.net/soft_zzti/article/details/79811923

【C++深度剖析教程19】前置操作符与后置操作符

今天来学习C中的前置操作符&#xff08;i&#xff09;与后置操作符&#xff08;i&#xff09;。 一回顾 以前在C语言的理论课程中&#xff0c;我们就学过&#xff0c;前置和后置操作符&#xff0c;有一定的区别&#xff1a; 但是我们可以看到下图&#xff0c;发现前置和后…

【C++的深度剖析教程20】类型转换函数上

今天来学习类型转换函数。 一回顾 我们学习C语言的时候&#xff0c;都知道&#xff0c;标准的数据类型之间&#xff0c;是可以做类型的转换的。分为隐式类型转换和强制类型转换。那么强制类型转换呢&#xff0c;比较简单。但是隐式类型转换&#xff0c;却存在诸多问题。下面我…

【C++的深度剖析教程21】类型转换函数下

上一篇文章写了关于普通类型转换为类类型的语法与性质&#xff0c;今天我们来看一下&#xff1a;类类型如何转换为普通类型。 一、类型转换函数&#xff1a; C类中&#xff0c;可以定义类型转换函数&#xff0c;类型转换函数用于将类对象转换为其他类型。 语法规则&#xff…

自定义链表增,删除,链表逆序

工作时间长了&#xff0c;经常用框架&#xff0c;感觉真的成了coding,建议有时间可以刷一下lettcode 时间一长就会忘&#xff0c;写了大半天&#xff0c;记录一下&#xff0c;理解后再写特别简单&#xff0c;链表逆序看了很多博客&#xff0c;写法各式各样&#xff0c;但是感觉…

【C++深度剖析教程22】继承的概念和意义

今天我们来学习C中的继承的概念和意义。 一、类之间的组合关系 问题&#xff1a;类之间是否存在直接的关联关系&#xff1f; 回答&#xff1a;类之间存在组合的关系&#xff0c;整体与部分的关系。 可以看一下生活中的例子&#xff1a; 下面我们以一个简单的程序来看一下…

设计模式笔记(24)---访问者模式(行为型)

Gof定义 表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。 动机 在软件构建过程中&#xff0c;由于需求的改变&#xff0c;某些类层次结构中常常需要增加新的行为&#xff08;方法&#xff09;&#xff0c;如果直接…

git 提交遇到error:fail to push some refer to 远程地址(url)

最近项目遇到一个问题&#xff0c;就是git 提交老是报错&#xff0c;但是在其他小伙伴&#xff0c;机器上没有事&#xff0c;调试了半天发现是git 提交时 -m ‘信息不能以“#”号开头’ 参考了下面博客&#xff0c;第一种操作方式&#xff1a; https://www.cnblogs.com/zndxal…

前端学习(95):ps基本操作与图片格式

jpg 色彩比较丰富 gif 动图 png 半透明 psd原始图片

【C++深度剖析教程23】继承中的访问级别

本C课程学习记录&#xff0c;完全来源于狄泰软件学院的相关课程&#xff0c;想一起学习的加我q1126137994或者q群199546072 给你推荐更多相关课程。 今天学习C中继承的访问级别。首先我们思考一个问题&#xff0c;子类是否可以直接访问父类的私有成员&#xff1f;&#xff1f…

【Makefile由浅入深完全学习记录1】认识make和makefile

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天开始学习项目又多了一项&#xff1a;Makefile由浅入深完全学习。之前做嵌入式Linux时&#xff0c;就一直在用make&#xff0c;但是对Makefile的理…

前端学习(96):切图流程

按下屏幕的prtscr 找到打开所在的文件 矩形框选中---ctrlc ---controlN------保存-----ctrlv 保存为jpg文件

【C++深度剖析教程24】C++中不同的继承方式

过完年了&#xff0c;今天开始写博客记录学习的过程。继续C的学习&#xff0c;今天我们来看C中不同的继承方式。 一、初探继承的方式 从上图看&#xff0c;是否可以将继承中的public换成protected或者private。如果可以&#xff0c;它们与public继承的区别是什么&#xff1f; …

前端学习(97):psd切图流程

编辑----首选项---增效工具----启用生成器 文件---生成----图像资源 选择图层修改命名为png&#xff0c;则再默认路径下生成。 默认为半透明

【C++深度剖析教程25】继承中的构造与析构

今天来学习C中继承的构造与析构&#xff0c;有兴趣一起学习的加qq&#xff1a;1126137994 1、问题 如何初始化父类成员&#xff1f;父类构造函数与子类构造函数有什么关系&#xff1f; 子类对象是如何构造的&#xff1f; 子类中可以定义构造函数子类构造函数必须对继承而来…

springboot创建子模块时遇到子模块覆盖父模块问题解决

1.最近更新git dev 开发分支需要添加一个子模块&#xff0c;创建过程中遇到 创建springboot 模块时&#xff0c;子模块覆盖了父模块&#xff0c;搞了半天&#xff0c;最后查询到解决办法如下&#xff1a; 1 多模块项目创建 因为本系列的下一篇是《Spring Boot集成Dubbo》&…