移植较新(Linux3.19)内核至mini2440开发板(一)

发布者:TechGuru123最新更新时间:2020-05-20 来源: eefocus关键字:移植  Linux3  内核  mini2440开发板 手机看文章 扫描二维码
随时随地手机看文章

下面开始正题


注:内核启动时可能会出现乱码,可以在u-boot下设置如下环境变量:setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200

saveenv 


1.1下载Linux3.19的源代码


从Linux kernel的官方网站可以下载最新的内核代码,我们选择linux-3.19.4.tar.gz这个文件下载。下载后解压至工作目录。进入内核目录,打开Makefile文件,修改如下两行:


-ARCH ?= $(SUBARCH)

-CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

+ARCH ?= $(SUBARCH)

+CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)


保存退出后执行

root@ginger-virtual-machine:/home/ginger/mini2440/linux-3.19.3# make menuconfig


打开内核配置界面,不做任何操作直接退出,然后在终端执行

root@ginger-virtual-machine:/home/ginger/mini2440/linux-3.19.3# make mini2440_defconfig

显示

## configuration written to .config

#


说明已经对采用了内核自带的mini2440的配置,这样可以减少我们手动配置内核的工作量。此时我们执行


root@ginger-virtual-machine:/home/ginger/mini2440/linux-3.19.3# make zImage

发现已经可以编译内核并生成内核镜像,这是因为新版本的Linux内核已经添加了对mini2440的支持.


1.2添加对平台的支持


在/linux-3.19.3/arch/arm/mach-s3c24xx目录下有一个名为mach-mini2440.c的源文件, 但是我们不使用它,将其删除后将该目录下的mach-smdk2440.c文件复制一份并改名为mach-mini2440.c.打开mach-mini2440.c文件,将其中关于LCD的定义均删除,后续我们将自己添加LCD驱动相关代码。


/* LCD driver info */

 

static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

 

.lcdcon5 = S3C2410_LCDCON5_FRM565 |

  S3C2410_LCDCON5_INVVLINE |

  S3C2410_LCDCON5_INVVFRAME |

  S3C2410_LCDCON5_PWREN |

  S3C2410_LCDCON5_HWSWP,

 

.type = S3C2410_LCDCON1_TFT,

 

.width = 240,

.height = 320,

 

.pixclock = 166667, /* HCLK 60 MHz, divisor 10 */

.xres = 240,

.yres = 320,

.bpp = 16,

.left_margin = 20,

.right_margin = 8,

.hsync_len = 4,

.upper_margin = 8,

.lower_margin = 7,

.vsync_len = 4,

};

 

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {

.displays = &smdk2440_lcd_cfg,

.num_displays = 1,

.default_display = 0,

 

#if 0

/* currently setup by downloader */

.gpccon = 0xaa940659,

.gpccon_mask = 0xffffffff,

.gpcup = 0x0000ffff,

.gpcup_mask = 0xffffffff,

.gpdcon = 0xaa84aaa0,

.gpdcon_mask = 0xffffffff,

.gpdup = 0x0000faff,

.gpdup_mask = 0xffffffff,

#endif

 

.lpcsel = ((0xCE6) & ~7) | 1<<4,

};

同时将static struct platform_device *mini2440_devices[] __initdata 函数中的&s3c_device_lcd,注释,将static void __init mini2440_machine_init(void)函数中的s3c24xx_fb_set_platdata(&mini2440_fb_info)和smdk_machine_init();注释。然后使用替换功能将代码中的所有smdk2440均替换为mini2440.

1.3修改晶振频率


将static void __init mini2440_init_time(void)函数中的s3c2440_init_clocks(16934400);更改为s3c2440_init_clocks(12000000)


1.4找到MACHINE_START(S3C2440, "SMDK2440")函数,将其修改为MACHINE_START(MINI2440, "Ginger's board"),如果不修改,将导致内核启动时直接卡在Starting kernel .......................处。此时保存后编译,内核已可以正常编译,但此时还有大部分驱动未编写,内核还无法正常启动。下一步我们将在源码中增加关于nand flash分区表的相关内容


1.5添加nand flash的支持


在mach-mini2440.c中增加以下内容


/* NAND Flash on MINI2440 board */

 

static struct mtd_partition mini2440_default_nand_part[]  = {

  [0] = {

  .name = "supervivi",

  .size = 0x00040000,

  .offset = 0,

  },

  [1] = {

  .name = "param",

  .offset = 0x00040000,

  .size = 0x00020000,

  },

  [2] = {

  .name = "Kernel",

  .offset = 0x00060000,

  .size = 0x00500000,

  },

  [3] = {

  .name = "root",

  .offset = 0x00560000,

.size = 1024 * 1024 * 1024, //

},

[4] = {

.name = "nand",

.offset = 0x00000000,

.size = 1024 * 1024 * 1024, //

},

};

 

static struct s3c2410_nand_set mini2440_nand_sets[]  = {

[0] = {

.name = "nand",

.nr_chips = 1,

.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),

.partitions = mini2440_default_nand_part,

.flash_bbt = 1, /* we use u-boot to create a BBT */

},

};

 

static struct s3c2410_platform_nand mini2440_nand_info = {

.tacls = 0,

.twrph0 = 25,

.twrph1 = 15,

.nr_sets = ARRAY_SIZE(mini2440_nand_sets),

.sets = mini2440_nand_sets,

.ignore_unset_ecc = 1,

};

添加如下头文件

#include 

#include

#include

#include

#include

在static struct platform_device *mini2440_devices[] __initdata函数中增加&s3c_device_nand,在static void __init mini2440_machine_init(void)函数中增加s3c_nand_set_platdata(&mini2440_nand_info);

保存后编译,下载到开发板上,可看到如下启动信息:

s3c24xx-nand s3c2440-nand: Tacls=1, 9ns Twrph0=3 29ns, Twrph1=2 19ns

s3c24xx-nand s3c2440-nand: NAND soft ECC

nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda

nand: Samsung NAND 256MiB 3,3V 8-bit

nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64

Creating 5 MTD partitions on "nand":

0x000000000000-0x000000040000 : "supervivi"

__nand_correct_data: uncorrectable ECC error

0x000000040000-0x000000060000 : "param"

ftl_cs: FTL header not found.

0x000000060000-0x000000560000 : "Kernel"

ftl_cs: FTL header not found.

0x000000560000-0x000040560000 : "root"

mtd: partition "root" extends beyond the end of device "nand" -- size truncated to 0xfaa0000

ftl_cs: FTL header not found.

0x000000000000-0x000040000000 : "nand"

mtd: partition "nand" extends beyond the end of device "nand" -- size truncated to 0x10000000

__nand_correct_data: uncorrectable ECC error


发现开发板已经可以识别nand flash的信息,但是打印出如下信息:

ftl_cs: FTL header not found.

解决方法如下:在内核根目录下执行make menuconfig,进入

Device Drivers ->

Memory Technology Devices (MTD) ->

去掉如下选项

<>FTL (Flash Translation Layer) support

<> NFTL (NAND Flash Translation Layer) support

<>INFTL (Inverse NAND Flash Translation Layer) support

保存后重新编译即可。

1.6到目前为止已经完成了对nand flash的支持,但是因为缺少根文件系统,内核依旧无法正常启动。接下去我们将为内核添加对yaffs2的支持。


在终端下执行#git clone git://www.aleph1.co.uk/yaffs2 获取最新的yaffs2源码。同步完后,进入yaffs2目录,执行# ./patch-ker.sh c m 内核源码路径,既可对内核打上yaffs2的补丁。进入内核目录,执行make menuconfig


选择File systems  --->  


 [*] Miscellaneous filesystems  --->       

 │    <*>   yaffs2 file system support

保存后退出,重新编译,此时会遇到几个错误,因为新版的Linux内核有一些对文件操作的函数进行了修改,我们需要按照错误逐一进行修改。按照错误:

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_readpage_nolock':

fs/yaffs2/yaffs_vfs.c:286: error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_hold_space':

fs/yaffs2/yaffs_vfs.c:484: error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_release_space':

fs/yaffs2/yaffs_vfs.c:502: error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_file_write':

fs/yaffs2/yaffs_vfs.c:594: error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c:606: error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_file_flush':

fs/yaffs2/yaffs_vfs.c:730: error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c:741: error: too few arguments to function 'yaffs_flush_file'

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_sync_object':

fs/yaffs2/yaffs_vfs.c:771: error: too few arguments to function 'yaffs_flush_file'

fs/yaffs2/yaffs_vfs.c: At top level:

fs/yaffs2/yaffs_vfs.c:781: error: 'generic_file_aio_read' undeclared here (not in a function)

fs/yaffs2/yaffs_vfs.c:782: error: 'generic_file_aio_write' undeclared here (not in a function)

fs/yaffs2/yaffs_vfs.c:787: error: 'generic_file_splice_write' undeclared here (not in a function)

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_iterate':

fs/yaffs2/yaffs_vfs.c:1719: error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_flush_inodes':

fs/yaffs2/yaffs_vfs.c:2190: error: too few arguments to function 'yaffs_flush_file'

fs/yaffs2/yaffs_vfs.c: In function 'yaffs_flush_super':

fs/yaffs2/yaffs_vfs.c:2203: error: too few arguments to function 'yaffs_flush_whole_cache'


打开/fs/yaffs2/yaffs_vfs.c,使用替换功能,将代码中的所有f_dentry均替换为f_path.dentry,将所有的yaffs_flush_file(obj, 1, 0);替换为yaffs_flush_file(obj, 1, 0,1);将yaffs_flush_file(obj, 1, datasync);替换为yaffs_flush_file(obj, 1, datasync,1);将yaffs_flush_file(obj, 1, 0);替换为yaffs_flush_file(obj, 1, 0,1);yaffs_flush_whole_cache(dev);替换为yaffs_flush_whole_cache(dev,1);

718行附近

- .read = do_sync_read,

- .write = do_sync_write,

+ .read = new_sync_read,

+ .write = new_sync_write,

- .aio_read = generic_file_aio_read,

- .aio_write = generic_file_aio_write,

+       .read_iter = generic_file_read_iter,

+       .write_iter = generic_file_write_iter,

- .splice_write = generic_file_splice_write,

+ .splice_write = iter_file_splice_write,


保存后重新编译,下载内核至开发板,同时烧录文件系统(为了测试方便,这次我先使用友善提供的制作好的文件系统root_qtopia.img在以后的教程中我们也会制作自己的文件系统),重启开发板,看到如下引导信息

Starting kernel ...

 

Booting Linux on physical CPU 0x0

Linux version 3.19.3 (root@ginger-virtual-machine) (gcc version 4.4.3 (ctng-1.6.1) ) #6 Sat Apr 25 13:37:14 CST 2015

[1] [2]
关键字:移植  Linux3  内核  mini2440开发板 引用地址:移植较新(Linux3.19)内核至mini2440开发板(一)

上一篇:对mini2440存储器的理解和使用
下一篇:mini2440采用minitools工具烧写系统或裸机程序方法

推荐阅读最新更新时间:2024-11-12 13:50

05-S3C2440学习之内核移植)linux3.4.2移植(4)支持LED驱动、按键驱动
一、前面的工作: (1)从头移植3.4.2内核,修改分区,制作jffs2文件系统 http://blog.csdn.net/fengyuwuzu0519/article/details/69802922 (2)修改内核支持yffs2、制作yffs2文件系统、内核裁剪、制作补丁 http://blog.csdn.net/fengyuwuzu0519/article/details/70162666 (3)移植内核支持DM9000C网卡驱动(可以使用mount nfs)、支持三路串口 http://blog.csdn.net/fengyuwuzu0519/article/details/72846205 到此我
[单片机]
05-S3C2440学习之<font color='red'>内核</font>(<font color='red'>移植</font>)linux3.4.2<font color='red'>移植</font>(4)支持LED驱动、按键驱动
基于ARM的Linux系统移植的方法
Linux具有源代码开放、效率高、可裁剪等优点,在嵌入式系统的开发中具有广泛的应用。文章介绍了嵌入式Linux操作系统、移植目标平台SBC2410及Linux内核源代码的目录结构,分析了Linux移植到SBC2410平台的实现过程,阐述了Linux内核、u-boot的裁剪和编译以及根文件系统的制作过程,最后在SBC2410平台上成功移植了嵌入式Linux系统。 嵌入式系统是一个专用的计算机系统。该系统以计算机技术为基础,软硬件可裁减,但对功能、可靠性、成本等都有严格的要求。今天,一些专用系统需要处理大量的信息,由于传统的计算机系统很难实现硬件可裁减,因而已经不能满足专用系统的需要。伴随着我国汽车、家电等产业的快速发展,
[单片机]
基于ARM的Linux系统<font color='red'>移植</font>的方法
合肥长鑫19nm DRAM存储器或年内下线
    中安在线、中安新闻客户端讯 据安徽商报消息 从传统的制造业,到战略性新兴产业为主的高端制造业,通过引进高科技企业和项目落地,合肥经开区正在打造智能家电、电子信息、汽车及新能源汽车、现代服务业四个千亿产业。所对应的,是不同类型企业产值的迅速提升。   “隐形冠军”藏在冰箱门边   位于合肥经开区的芯瑞达科技股份有限公司是一家专业从事液晶显示背光源、半导体封装等相关产品研发、生产、销售的高新技术企业。听到“背光源”,大部分人可能不太了解。芯瑞达副总经理王光照解释,一台普通的家用电视或者显示器,供电之后液晶显示屏可发光,继而产生清晰的图像,其实电视本身是不发光的,是液晶屏背后的背光源在起作用,这个“点亮”屏幕的背光源就是芯瑞达所
[半导体设计/制造]
苹果头戴式AR装置预计4Q19量产
天风国际分析师郭明錤以其对苹果的准确预测而声名崛起。上周,郭明錤再次重复了关于苹果AR产品的预测,表示 Apple 将推出 AR 产品 ,头戴式 AR 装置最快于 4Q19 量产。对于虚拟现实行业来说,这无疑是令人振奋的消息。 而在昨天,郭明錤则对 iPhone SE 2 主要规格、售价、产业链产能与出货量进行了预测。在预测中,郭明錤表示,iPhone SE2 外观设计与大部分的硬件规格与 iPhone 8 相似。预期 iPhone SE 2 将采用 A13 芯片,3GB LPDDR4X,64GB 或者 128GB NAND Flash 存储。设备外观配色可能会有深空灰、白色与红色。此外,由于苹果早已开始逐步放弃 3D Tou
[嵌入式]
u-boot-2016.11移植到S3C2440之第一阶段修改(2)
1、u-boot-2016.11的第一个启动的文件为archarmlibvectors.S,系统上电时,产生复位异常,从vectors.S中的reset跳转到start.S (archarmcpuarm920t),在该文件中修改系统时钟代码,并添加上icache的启动代码加快启动速度(添加到屏蔽IRQ中断代码之后): /******************初始化系统时钟********************/ ldr r0,=0x4c000014 mov r1,#0x05 /*FCLK:HCLK:PCLK = 1:4:8 = 400M:100M:50M*/ str r1, mrc p15, 0
[单片机]
u-boot-2016.11<font color='red'>移植</font>到S3C2440之第一阶段修改(2)
e络盟携手英飞凌发起“内核”设计挑战赛及同主题网络研讨会
e络盟携手英飞凌发起“内核”设计挑战赛及同主题网络研讨会 比赛鼓励参赛者使用ModusToolboxTM 3.0构建多核项目工作流程 来探究PSoC™ 6微控制器内核 中国上海,2022年10月18日 – 安富利旗下全球电子元器件产品与解决方案分销商e络盟通过其在线社区与英飞凌联合发起“内核”设计挑战赛及同主题网络研讨会, 以激励社区成员通过英飞凌ModToolsbox TM 3.0平台来探索PSoCTM 62S4板的新型双核架构。比赛要求参赛者在项目设计中应用Cortex-M0+内核的低功耗模式及Cortex-M4内核的处理能力。同主题网络研讨会将于2022年11月10日举行,以深入探讨PSoCTM 62S4内核架
[物联网]
e络盟携手英飞凌发起“<font color='red'>内核</font>”设计挑战赛及同主题网络研讨会
2019Q2全球IC设计公司TOP10营收排名出炉,博通冠军
根据集邦咨询旗下拓墣产业研究院最新统计,全球前十大IC设计业者2019年第二季营收排名出炉,受中美贸易战及供应链库存攀升影响,全球消费性电子产品包括智能手机、平板、笔电、液晶监视器、电视与服务器等市场需求皆不如预期,前五名业者第二季营收皆较去年同期衰退,其中英伟达(NVIDIA)衰退幅度最大,达20.1%,这也是英伟达近三年来首见连续三个季度营收呈现年衰退的情况。 拓墣产业研究院资深分析师姚嘉洋表示,博通(Broadcom)与高通(Qualcomm)的主力市场皆在中国,在贸易战与中国市场需求不振的情况影响下,中国系统业者对零组件拉货力道疲软,导致博通与高通第二季营收皆较去年同期下滑。 而高通同时面对联发科(Medi
[半导体设计/制造]
20<font color='red'>19</font>Q2全球IC设计公司TOP10营收排名出炉,博通冠军
东晶电子2019年净利增119%,5G相关产品研发顺利推进
近日,东晶电子发布2019年年报显示,公司实现营收为2.1亿元,同比增长18.67%;归属于上市公司股东的净利润为1479.34万元,同比增长118.81%。 东晶电子主要从事石英晶体元器件的研发、生产和销售,主要经营产品包括谐振器、振荡器等石英晶体元器件。公司产品广泛应用于通讯、资讯、汽车电子、移动互联网、智能控制、 家用电器、智能安防和航天军工等领域。已拥有了索尼、佳能、松下、三星、海康威视、大华、海信等一批国内外知名电子终端厂商客户,并与其保持着良好的合作关系。 从行业来看,报告期内,石英晶体元器件产品市场波动明显。总体来看,订单竞争激烈、产品单价下行、生产设备加速淘汰等不利因素仍然存在。针对上述问题,公司及时研判市场变
[手机便携]
东晶电子20<font color='red'>19</font>年净利增1<font color='red'>19</font>%,5G相关产品研发顺利推进
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved