【移植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,一经查实,立即删除!

相关文章

通过split命令分割大文件

场景 1.线上出了问题&#xff0c;我需要去查找log来定位问题&#xff0c;但是由于线上数据量庞大&#xff0c;这些log文件每过一个小时就会自动回滚一次&#xff0c;尽管如此&#xff0c;有的log文件依然达到了五六g以上的大小。 对于这种巨大的log文件&#xff0c;常用的一些…

一个简单的 Generic Factory 类

简单的工厂类的一个使用场景是&#xff0c; 假设有一个基类 BaseClass&#xff0c; 和一系列的子类 A&#xff0c; B&#xff0c; C&#xff0c; 工厂类根据某个参数&#xff0c;例如字符串 “A”, “B”, “C” 创建出相应的子类。 举例如下&#xff1a; public class Factory…

【移植驱动到Linux3.4.2内核之一】移植DM9000C网卡驱动

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 之前已经把uboot&#xff0c;内核&#xff0c;文件系统&#xff0c;都移植好了&#xff0c;今天开始我们把第二期写的Linux2.6.22.6内核的驱动程序全部…

位运算实现一些小算法

package com.asiainfo.cem_volte_hbase;/*** ClassName Test* Description 有意思的小算法* Author qianxl* Date 2019-08-02 17:34* Version 1.0**/ public class Test {/*** * param num1 * param num2* description: 写一个函数&#xff0c;求两个整数之和&#xff0c;要求…

关于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;你…

【C++深度剖析教程18】逗号操作符的分析

今天来学习C中的逗号操作符。那么什么是逗号操作符呢&#xff1f; *逗号操作符&#xff08;&#xff0c;&#xff09;可以构成逗号表达式 逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式的前N-1个表达式的值可以没有返回值逗号…

UML 模型

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

CRM软件设计评测点与采集测评点

系统架构 在这部分&#xff0c;我们首先会验证参测产品的开发平台以及支持的客户端种类等情况&#xff0c;以便于用户的IT部门了解这些产品的技术基础。同时我们也会考察产品与第 三方管理系统交互的能力&#xff0c;比如是否支持按照各种常见客户信息管理应用的数据格式进行导…

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

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

吞吐量(TPS)、QPS、并发数、响应时间(RT)

开发的原因&#xff0c;需要对吞吐量&#xff08;TPS&#xff09;、QPS、并发数、响应时间&#xff08;RT&#xff09;几个概念做下了解&#xff0c;查自百度百科&#xff0c;记录如下&#xff1a; 1. 响应时间(RT)   响应时间是指系统对请求作出响应的时间。直观上看&#…

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

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

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

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

JQuery技巧(转)

转自http://www.cnblogs.com/top5/archive/2010/01/17/1649984.html1.禁用右键菜单$(document).ready(function(){$(document).bind("contextmenu",function(e){return false;});});2.让字体闪烁jQuery.fn.flash function( color, duration ){var current this.css…

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

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

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

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

前端学习(94):css重置样式

CSS Reset&#xff0c;意为重置默认样式。HTML中绝大部分标签元素在网页显示中都有一个默认属性值&#xff0c;通常为了避免重复定义元素样式&#xff0c;需要进行重置默认样式&#xff08;CSS Reset&#xff09;。举几个例子&#xff1a; 1.淘宝&#xff08;CSS Reset&#xf…

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

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