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

2020-05-20来源: eefocus关键字:移植  Linux3  19  内核  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:

[1] [2]
关键字:移植  Linux3  19  内核  mini2440开发板 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic497709.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

msp430的printf函数的简单移植
这几个月都在做一个基于TCS34725的RGB颜色传感器的工程,我使用的主控是MSP430,平时调试的时候用485总线发送到上位计(电脑或上层主控机),开始直接用串口发送函数直接发送,但是很多数据显示超级不方便,比如浮点数和有特地格式的数据流,先前都是自己用串口发送函数组一函数就是调用了int putchar(char *) 函数,于是我花了几分钟写了一个putchar函数,已使用,还真的成功了…….,想想先前傻逼的一个一个的构造格式,转化数字为字符串,现在终于可以使用printf函数了….int putchar(int ch){    if (ch == 'n')    &n
发表于 2020-04-19
移植新内核4.15.6到JZ2440开发板
近来无事就想着动手移植新的内核在JZ2440开发板上跑起来,https://www.kernel.org/ 下载kernel linux-4.15.6.tar.xd,执行xz -d linux-4.15.6.tar.xztar -xvf linux-4.15.6.tar进行解压操作,就可以进行移植操作了。1.修改Makefile文件:-ARCH           ?= $(SUBARCH)-CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)+ARCH     
发表于 2020-04-17
jz2440 ----移植自制的USB RTL8188EUS网卡驱动
我用的文件系统是jz2440的移植的系统,而我copy的库文件 实际是在ubuntu的网络文件里面,所以可以尝试挂载网络文件系统来解决!set bootargs console=ttySAC0,115200 init=linuxrc root=/dev/nfs nfsroot=192.168.2.102:/work/nfs_root/fs_mini_mdev_new ip=192.168.2.5:192.168.2.102:192.168.2.1:255.255.255.0::eth0:off 可能iphone没有设置wep加密方式导致,无法验证这个功能下面验证wpa加密方式:b.1 先编译它的依赖libopenssl 
发表于 2020-04-16
jz2440 ----移植自制的USB RTL8188EUS网卡驱动
MSP430F149程序移植——0.96OLED(ssd1306驱动)
一、引脚说明1.1 接口定义1.2 硬件连接1.3 总线协议IO口软件模拟SPI1.4 软件控制流程①IO初始化。②根据时序初始化LCD。③显示。二、移植文件将 oled.c 、 oled.h 、bmp.h文件加入到工程文件夹下2.1 oled.c#include "oled.h"#include "oledfont.h"   //向SSD1306写入一个字节。//dat:要写入的数据/命令//cmd:数据/命令标志 0,表示命令;1,表示数据;void OLED_WR_Byte(u8 dat, u8 cmd){ u8 i; if (cmd) OLED_DC_Set
发表于 2020-04-07
MSP430F149程序移植——0.96OLED(ssd1306驱动)
[stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
>_<:这里的动画是黄色矩形区域中一个模仿俯视图的起重机运作动画,一个是模仿主视图的吊钩的运动。通过改变初始Init函数中的数据b_x,b_y实现矩形区域的移动。当实时采集时要首先根据起重机的实际情况改变比例,当传感器传来数据时就相当于这里的run函数,只要把传感器数据接收函数和相关函数结合即可。>_<:main code:  1 #include "stdlib.h"  2 #include "GUI.H"  3 /*  4 颜色  5 */  6 #define Black    &nb
发表于 2020-04-07
ucos-ii和ucgui在stm32上的移植及工程
uc/os-ii移植笔记(此部分参考了tomato的介绍)os_cpu.h与编译器相关的数据类型 typedef   unsigned char   BOOLEAN;typedef   unsigned char   INT8U;                    /* 
发表于 2020-04-07
小广播
何立民专栏 单片机及嵌入式宝典

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

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