历史上的今天
返回首页

历史上的今天

今天是:2025年12月07日(星期日)

正在发生

2022年12月07日 | 一文了解移植3.4.2的Kernel到JZ2440

2022-12-07 来源:zhihu

本文将介绍如何移植linux-3.4.2内核到JZ2440开发板上的全过程,使用的交叉编译工具版本为 arm-linux-gcc-4.3.2.tar.bz2


下面来一步一步介绍如何移植。


由于kernel的启动参数是由Uboot传递的,关键的参数有 R0=0 R1=Mach-Type R2=Tag参数地址


其中,Mach-Type为内核支持板子的硬件型号,tag参数为Uboot存放传递给Kernel参数的内存地址。


内核启动时,根据传入的Mach-Type参数选择对应的板级初始化函数来初始化,然后解析tag参数,设置相应系统状态值,装载驱动程序,最后挂载根文件系统。


1. 编译内核


修改根目录下面的Makefile,该ARCH ?= arm ,CROSS_COMPILE ?= arm-linux-


针对arm架构的板级配置文件,位于 arch/arm/configs/mini2440_defconfig 和 s3c2410_defconfig 这两个有参考意义的配置文件。


配置内核 make s3c2410_defconfig


编译内核 make uImage //最终生成的uImage位于 arch/arm/boot/uImage


测试新内核 开机进入boot命令行,tftp 0x32000000 uImage ; bootm 0x32000000;


问题解决:新内核启动后,有可能串口打印出乱码,原因可能是 Uboot没有传递 console 的正确参数,也有可能是内核对于串口时钟频率没有初始化成功。


Uboot启动时传递的Mach-Type,如果有命令行指定的,则使用指定的,否则就使用环境变量中的machid值。


对于内核来说,每种硬件配置的板子都对于一个固定的Mach-Type ID,Uboot传递的Mach-Typ必须与其一致,这样,内核才能正确识别。


最少的内核启动命令行: set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 ; set machid MACH_ID


内核支持的板级列表文件为: include/generated/mach-types.h


这里,我们使用的是smdk2440配置:


   1:  //arch/arm/mach-s3c24xx/mach-smdk2440.c

   2:  static void __init smdk2440_map_io(void)

   3:  {

   4:      s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

   5:      s3c24xx_init_clocks(12000000);   //将原来的16934400 改为 12000000

   6:      s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

   7:  }

然后,重新编译,测试就可以。


2. 修改内核默认分区


默认内核启动,对nand flash的分区如下:

这样的分区,不是我们想要的,通过在内核代码中搜索 “S2C2410 flash partitions 1”可以找到位于 common-smdk.c中smdk_default_nand_part分区数组。


我们期望的分区为:

经过修改后的分区数组如下:


   1:  //  arch/arm/mach-s3c24xx/common-smdk.c

   2:  static struct mtd_partition smdk_default_nand_part[] = {

   3:      [0] = {

   4:          .name    = "Bootloader",

   5:          .size    = SZ_256K,

   6:          .offset    = 0,

   7:      },

   8:      [1] = {

   9:          .name    = "params",

  10:          .offset = MTDPART_OFS_APPEND,

  11:          .size    = SZ_128K,

  12:      },

  13:      [2] = {

  14:          .name    = "kernel",

  15:          .offset = MTDPART_OFS_APPEND,

  16:          .size    = SZ_2M,

  17:      },

  18:      [3] = {

  19:          .name    = "rootfs",

  20:          .offset    = MTDPART_OFS_APPEND,

  21:          .size    = MTDPART_SIZ_FULL,

  22:      }

  23:  };


3. 修改内核支持yaffs2文件系统

3.4.2内核版本 默认支持 jaffs2 文件系统,而且在挂载根文件系统的过程中,尝试能够支持的文件系统类型(ext2,3,cramfs,vfat,msdos romfs等)


如果文件系统类型为 jffs2类型,需要重新设置bootargs,


set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2


如果是yaffs2类型,不需要重新设置


编译根文件系统的编译器最好和编译内核的编译器保持一致。 先配置好交叉编译工具链,然后编译Busybox后,执行 make install CONFIG_PREFIX=/home/hao/nfs/fs_mini_mdev_new/ , 这样,基本的文件系统框架出来了。


接着,安装glibc库, 拷贝交叉编译工具链目录下的


这两个库的所有的so文件拷贝到 fs_mini_mdev_new目录下的lib目录(新建立的lib目录),拷贝的时候,注意 cp *so* /home/hao/nfs/fs_mini_mdev_new/lib –d -d选项拷贝保留链接属性。目录属性对应一致。


构建基本的linux目录,etc目录,这个目录可以参考以前已经创建好的etc目录


dev目录,这个目录下,需要事先创建两个特殊设备 console 和null ,具体信息可以参考linux系统上的设备


其他必须的目录有,proc,tmp,mnt,sys,root等。


创建jffs2文件类型的根文件系统:


mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2


-s 扇区大小


-e 可擦除块


-d 源目录


-o 输出文件


如果出现 :

说明,内核收到退出代码为0x04的信号,经过查阅得知为非法指令,可能是内核不支持由此编译器编译出的init的特殊指令,需要设置内核支持此指令。


Kernel Features –> Use the ARM EABI to compile the kernel 选中已支持 eabi特性。


为什么内核不支持yaffs2文件系统呢?因为内核代码中不包含yaffs文件系统源码,但是包含jffs2文件系统源码。


通过git命令下载yaffs2文件系统源码:git clone git://http://www.aleph1.co.uk/yaffs2


切换到yaffs2目录中,执行 ./patch-ker.sh c m /to/linux/dir ,然后去linux源码中,通过make menuconfig来配置yaffs2即可。


编译yaffs2中出现的错误,是yaffs中结构体函数引用不正确,加上下划线就可以了。


另外,需要在 最新版本的Uboot的代码 drivers/mtd/nand/nand_util.c 中 ,添加 WITH_YAFFS_OOB这一项,就可以正常启动yaffs格式的uImage了。


// drivers/mtd/nand/nand_util.c

 

555  if (!need_skip && !(flags & WITH_DROP_FFS) && !(WITH_YAFFS_OOB)) {                                   

556         rval = nand_write(nand, offset, length, buffer);

557         if (rval == 0)

558             return 0;

559 

560         *length = 0;

561         printf("NAND write to offset %llx failed %dn",

562             offset, rval);

563         return rval;

564     }

4. 裁剪内核

现在 .config配置文件中找支持的单板类型,然后在menuconfig中搜索选项配置位置,按图索骥,去掉对于支持类型选项。


去掉内核支持的其他单板类型,只保留指定单板代码:

搜索可知:

去掉对于支持的类型即可。


在嵌入式领域用不到的文件系统,可以去掉,例如 ext2、ext3、ext4等。msdos要保留,应该以后可能会接U盘,而U盘一般为vfat文件系统。

推荐阅读

史海拾趣

ELM [ELM Electronics]公司的发展小趣事

ELM始终将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,ELM还注重客户需求和反馈,不断优化产品和服务,以满足客户的个性化需求。这些举措使得ELM的产品在市场上享有很高的声誉和口碑,客户满意度持续提升。

Gigavac LLC公司的发展小趣事

随着产品线的不断扩张,ELM开始积极拓展市场,寻求更广阔的发展空间。公司制定了国际化战略,通过参加国际展会、建立海外销售渠道等方式,成功将产品打入国际市场。同时,ELM还积极与国际知名电子企业开展合作,共同研发新产品、开拓新市场。这些举措不仅为ELM带来了更多的商业机会,也提升了公司的国际影响力。

铨力(ALLPOWER)公司的发展小趣事

随着市场竞争的加剧,铨力公司意识到单纯依靠太阳能电源产品已无法满足市场需求。于是,公司开始着手研发更为先进、高效的能源技术。经过多次试验和改进,铨力成功突破了技术瓶颈,研发出了新一代高效能、低成本的太阳能电池板。这一技术的突破不仅提升了产品的竞争力,也为公司打开了更广阔的市场空间。

AKM [Asahi Kasei Microsystems]公司的发展小趣事

随着市场竞争的加剧,铨力公司意识到单纯依靠太阳能电源产品已无法满足市场需求。于是,公司开始着手研发更为先进、高效的能源技术。经过多次试验和改进,铨力成功突破了技术瓶颈,研发出了新一代高效能、低成本的太阳能电池板。这一技术的突破不仅提升了产品的竞争力,也为公司打开了更广阔的市场空间。

Corstat Containers公司的发展小趣事

为了进一步拓展国际市场,Corstat Containers公司积极寻求与国际知名电子企业的合作。通过参加国际电子展会、建立海外销售渠道等方式,公司成功打开了多个国家的市场。同时,公司还与国外科研机构展开合作,共同研发更加先进的电子产品包装技术,为公司的长期发展奠定了坚实的基础。

ATOP_Technologies公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,ATOP Technologies开始将目光投向更广阔的市场。公司积极参与国内外各类行业展会和交流活动,加强与同行和客户的交流与合作。同时,ATOP Technologies还积极开展国际合作,与多个国家的知名企业建立了战略合作关系,共同推动工业自动化领域的发展。

问答坊 | AI 解惑

一个免费液晶样品的机会

附件是申请方法和选型表。 该液晶被网友选为09年电子技术应用最佳产品 …

查看全部问答>

如何检测串口接收到什么数据?

我现在用一个GPS芯片接收卫星传下来的数据,用万用表测量,发现电压为2.45V,提供的电压是3.3V,应该是接收到了数据,但是用MiniCDU就是无法现实接收到的数据,用系统的超级终端还是无法检测到是否接收到数据了,请问高手,这是什么原因啊?…

查看全部问答>

有什么方法可以判断某仪器的空间位置.

比如一个仪器,在一个房间里移动,需要什么技术得对这个仪器对房间的空间坐标.…

查看全部问答>

wince注册表设置的疑问:

在注册表中偶然看到这个一段:   \"DevConfig\"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00请问这个设置 是根据什么来设的呀?作用是什么呀?…

查看全部问答>

DSP不停复位,求助!

我现在的板子,JTAG可以烧写程序,可以调试。复位芯片用的MAX708R,用JTAG仿真,F5运行, / RESET 引脚上常为高,DSP2812正常工作,但是拔掉仿真器,断电后,用示波器检测/RESET(MAX708R) 检测到有200HZ的复位信号,。XCLKOUT 输出为3.75M,奇怪了 ...…

查看全部问答>

设计一个定时中断程序

急急急,帮忙设计一个10ms定时中断程序!!!跪谢!!!…

查看全部问答>

MSP430下一代产品wolverine

TI发布MSP430下一代微处理器平台wolverine(金刚狼),功耗降低50%。wolverine 的超低功耗得益于三个方面:一、超低漏电 (ULL) 工艺技术。独特的混合信号超低漏电流工艺技术可实现众多的新型低功耗外设,在任何温度下均始终如一地保持低功耗特 ...…

查看全部问答>

易电源试用贴_lyzhangxiang

先上传试用计划吧,之前一直很忙还好soso一直给我留着名额。 说实在的平时基本上都是用一些LDO就对付了,DCDC的接触的不多。印象最深刻的就是这些DCDC的芯片不管是升压的还是降压的都需要外围的电感啊、快速二极管什么的。一般选取上都不是很容易 ...…

查看全部问答>

通用系统软件—开发安防系统管理软件的工具软件

安防系统什么最重要?控制部分最重要,控制部分的好坏关系到系统硬件设备资源的利用程度。用软件控制肯定要强于硬件设备控制。 由于每个系统可能含有不同协议硬件设备、不同的设备规模、不同的功能要求,从而使系统管理软件个性化,通常要专业软 ...…

查看全部问答>