历史上的今天
返回首页

历史上的今天

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

正在发生

2021年07月26日 | linux 2.6.32 在arm9(s3c2440)平台的移植

2021-07-26 来源:eefocus

板子用的友善的mini2440, 起初按照光盘提供的手册, 照猫画虎,,,,,,,,,但是遇到各种问题, 很多未解决.....原因是还没理解每层目录的Makefile和Kconfig的关系, 以及在Kernel Configure菜单树中对应的选项, 以及对nand_flash设备的结构体的意义没搞清楚,~ so~


在http://www.kernel.org/ 下载2.6.32的源代码. 编译器用的arm-linux-gcc 4.1.2 .


1 内核代码/uboot代码中中机器码的定义位置,在/root/linux-2.6.32/arch/arm/tools/mach-types 和 uboot/include/asm-arm/mach_type.h, 启动时bootloader向内核传递机器码. 如果bootloader传递给内核的机器码不匹配, 则,,,,,


2

 (1) 在/linux-2.6.32/arch/arm/mach-s3c2440/mach-smdk2440.c中的__init smdk2440_map_io函数中修改晶震频率:

static void __init smdk2440_map_io(void)

{

        s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

        s3c24xx_init_clocks(12000000);

        s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}


(2)  找到MACHINE_STAR宏定义, 修改机器码; (未修改)


MACHINE_START(S3C2440, "SMDK2440") //改为"MINI2440"

        /* Maintainer: Ben Dooks

        .phys_io        = S3C2410_PA_UART,

        .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

        .boot_params    = S3C2410_SDRAM_PA + 0x100,

        .init_irq       = s3c24xx_init_irq,

        .map_io         = smdk2440_map_io,

        .init_machine   = smdk2440_machine_init,

        .timer          = &s3c24xx_timer,

MACHINE_END


(3 ) 这个mach-smdk2440.c文件对应make menuconfig中的那个选项?  


找到该目录的Makefile: obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o 找到该目录的Kconfig: config ARCH_S3C2440 bool "SMDK2440"  #这是在configure中显示的字符


 select CPU_S3C2440 select S3C2440_XTAL_16934400 select MACH_SMDK select S3C_DEV_USB_HOST select S3C_DEV_NAND help



在Configure菜单中按/查找, mach-smdk2440.o的连接条件在 System Type ->S3C2440 Machines->SMDK2440, 如果想让刚才修改的mach-smdk2440.c部分代码被编译进image, 则必须选上这个选项,  


移植过程中的代码都是联动的, 改了某个.c文件的代码并想让这部分改动被编译进image, 则还要改动对应的makefile, 及kconfig文件, 最后还要在configure的菜单树中选择此选项. 


3

配置选项: 执行make s3c2410_defconfig, 以及make menuconfig,


(1) make s3c2410_defconfig命令会在arch/%处理器平台%/configs/下找名为s3c2410_defconfig的文件 然后将其复制到顶层目录并改名为.config, make s3c2410_defconfig命令会遍历arch/下的所有子目录吗? 不会, 因为在顶层的makefile中, 


        ARCH  ?= arm                            #指定在arch下的子目录


        CROSS_COMPILE ?= arm-linux- #指定调用的编译器


(2) 随后执行的 make menuconfig 会读取linux-2.6.32/.config的内容,并显示出来. 以下是更多编译命令的说明:


         make mrproper --- 清理全部文件,包括.config和一些备份文件


         make clean --- 清理生成文件,但会保留.config和一些模块文件


         make config --- 基于文本的最为传统的配置界面,不推荐使用


         make menuconfig --- 基于文本选单的配置界面,字符终端下推荐使用


         make xconfig --- 基于图形窗口模式的配置界面,Xwindow下推荐使用  


4

主要涉及以下几个结构体, 其实这些代码在总体内核中的作用也不甚明白, 基本都是照搬, 所以才会有之后的映像错误, 比如那个结构体数组的作用


static struct platform_device __initdata *smdk_devs[] = ,


为什么要在里面注册&s3c_device_nand, ? 这些都不清楚, 也是之后犯错的原因


(1) 更改板载nand flash的分区, 打开文件: arch/arm/plat-s3c24xx/common-smdk.c , 修改为如下:

static struct mtd_partition smdk_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, //

        }

};


(2) 把s3c_device_nand注册进平台, 这里本来一致, 不用修改


static struct platform_device __initdata *smdk_devs[] = {

        &s3c_device_nand, //

        &smdk_led4,

        &smdk_led5,

        &smdk_led6,

        &smdk_led7,

};//not changed


static struct platform_device __initdata *smdk_devs[] = {

        &s3c_device_nand, //

        &smdk_led4,

        &smdk_led5,

        &smdk_led6,

        &smdk_led7,

};//not changed


总结nand flash涉及到的结构体如下: 


     struct mtd_partition                           default_nand_part[]     单片flash对分区的定义


     static struct s3c2410_nand_set            smdk_nand_sets[]       板子上所有flash的sets集


     static struct s3c2410_platform_nand     smdk_nand_info 


     static struct platform_device __initdata  *smdk_devs[]


5    

修改drivers/mtd/nand/s3c2410.c,


禁止flash ECC校验(友善的手册没有此项), 注意, 这个去掉ECC校验的问题,在内核中明确说明是不建议这样做的,因为这样就等于忽略了对NAND FLASH坏块的检测. But~ 据说vivi或uboot通过软件算法产生的ecc校验码于S3C2410 NAND Flash 控制器产生的ecc校验码不一致,所以在这里选择禁止内核ECC校验. 

找到static void s3c2410_nand_init_chip函数,在该函数体最后一行加上 : 


6(暂不做)


 为2.6.32打上yaffs2补丁,


早先的yaffs 仅支持小页(512byte/page)的nand flash,现在的开发板大都配备了更大容量的nand flash,它们一般是大页模式(2K/page),使用 yaffs2 就可以支持大页的 nand flash. 步骤如下,


(1) 获取yaffs2代码


    mkdir yaffs2-src


    cd yaffs2-src


    git  clone git://www.aleph1.co.uk/yaffs2


(2) 下载yaffs2的最新源码.并打补丁:


  ./patch-ker.sh c /root/linux-2.6.32


此时已经成功更新2.6.32代码中的yaffs2部分,linux-2.6.32.2/fs下增加一个yaffs2目录


回到/root/linux2.6.32, 执行make menuconfig, File systems->Miscellaneous->选中yaffs2支持.


7(暂不做)

为2.6内核增加devfs,linux2.6已经去掉devfs,为了内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统(yaffs文件系统是不是需要devfs支持?)

vi fs/Kconfig,找到menu "Pseudo filesystems"处增加如下:

config DEVFS_FS   #config的标识

     bool "/dev file system support (OBSOLETE)"

     depends on EXPERIMENTAL

     help


config DEVFS_MOUNT

     bool "Automatically mount at boot"

     depends on DEVFS_FS #依赖上面的DEVFS_FS

     help


config DEVFS_DEBUG

     bool "Debug devfs"

     depends on DEVFS_FS #依赖上面的DEVFS_FS

     help


重新make menuconfig 在File systems->Pseudo filesystems目录里面可以后到devfs的配置选项如下:


[*] /proc file system support                                           


[*] /dev file system support (OBSOLETE)                                 


[*]     Automatically mount at boot                                       


[*]     Debug devfs                                                       


[*] Virtual memory file system support (former shm fs)                  


[  ] Relayfs file system support


8

修改内核启动选项, make menuconfig, 

这里绝大部分选项都先采用默认设置,待移植成功后我们再进一步裁减, 以上(3)中修改了common-smdk.c, 为了让修改生效, 必须选上


还有启动参数 Boot Options ---> Default kernel command string:  (注意, )


noinitrd root=/dev/mtdblock4 console=ttySAC0,115200

解释, 也就是mtdblock3是存放cramfs根文件系统的分区,故设置 root=/dev/mtdblock3. console=ttySAC0指kernel启动期间的信息都输出到串口1上. 

推荐阅读

史海拾趣

A/D Electronics Inc公司的发展小趣事

A/D Electronics Inc深知人才是企业发展的核心力量。因此,公司高度重视研发团队的建设和人才培养。通过引进国内外优秀人才和加大研发投入,公司不断提升研发团队的实力和创新能力。同时,公司还建立了完善的培训体系,为员工提供持续的学习和成长机会,激发了员工的创造力和工作热情。

Daburn公司的发展小趣事

在Daburn公司的发展历程中,质量控制一直是重中之重。公司建立了严格的质量管理体系,从原材料采购到生产流程再到成品检验,每一个环节都严格把控。此外,Daburn还注重持续改进,通过引入先进的生产设备和工艺,不断提高产品的质量和性能。这种对质量的执着追求让Daburn赢得了客户的信任和好评。

Continental公司的发展小趣事

随着技术的不断进步和市场的不断变化,大陆集团也在不断调整其业务架构。在新的架构中,大陆集团将业务领域划分为三个部分:自主驾驶和安全、车联网和信息、以及橡胶技术(包括轮胎业务和康迪泰克)。这一调整使得大陆集团能够更好地应对市场变化和技术挑战。同时,大陆集团还通过收购和兼并等方式不断扩大其业务范围和技术实力。

Fairview Microwave Inc公司的发展小趣事

随着技术的不断进步和市场的不断变化,Fairview Microwave意识到只有不断创新才能保持领先地位。因此,公司加大了在研发方面的投入力度,建立起一支高素质的研发团队。他们不断推出具有自主知识产权的新产品和技术,为客户提供更加全面、高效的解决方案。这些创新成果不仅增强了公司的核心竞争力,也为公司在行业内树立了技术领先的地位。

Chemi-Con公司的发展小趣事

随着电子行业的快速发展,Chemi-Con公司不断加大对研发的投入,致力于技术创新和产品升级。公司研发团队在铝电解电容器的基础上,不断推出性能更优、体积更小、寿命更长的产品,满足了市场对于高效、可靠电容器的迫切需求。此外,Chemi-Con还积极拓展产品线,涉足了多层陶瓷电容器、薄膜电容器等多个领域,为客户提供更加丰富的选择。

Accetek公司的发展小趣事

Accetek公司创立之初,面临着激烈的市场竞争和技术挑战。然而,创始人凭借对电子行业的深刻理解和前瞻性的眼光,选择了数控雕刻机和激光雕刻机作为公司的主营业务。通过不断的技术研发和市场调研,Accetek成功推出了一系列高质量、高性能的产品,逐渐在市场中站稳脚跟。

问答坊 | AI 解惑

请教开关电源变压器

现在开发一款开关电源.输入为美规120V.输出5V/1A.单片开关电源芯片选定为TOP221.高频变压器为3个绕组.120V输入绕组,5V输出绕组和检测电源绕组.请教象这样的变压器的参数是怎样的?谢谢!…

查看全部问答>

EPS扭矩传感器的相关研究

         EPS主要由[url=http://www.ftxsensor.cn/]扭矩传感器[/url]、车速传感器、电动机、减速机构和电子控制单元(ECU)等组成。          通过传感器探测司机在转向操作时方向盘产 ...…

查看全部问答>

基于DSP+CPLD的交流电机调速在水处理控制中的应用

1 引言 生化反应池在水处理过程中非常重要。需要通过调整风机的转速控制反应池中的DO值。理论上应该通过调节电动机的转速来实现,但实际上却是利用挡板阀门后者放空的方法进行调节。这种方法极大地浪费了电力资源。以美国TI公司推出的TMS320LF240 ...…

查看全部问答>

急!急!急!请教一个关于udp通信的问题

我想在一个多任务程序中用udp方式实现任务之间的通信,应该属于在本地机上实现通信,不知道怎么做啊,把ip设成一样的127.0.0.1就可以了吗?…

查看全部问答>

ADS 1.2开发环境下如何使用libxml2库?

我想在ADS下调用libxml2解析器的函数,有知道怎么导入的么? 或者还有其他更方便的xml解析库么? 刚用tinyxml试了下,好多Error,是不是ADS下对c++支持不怎么好?…

查看全部问答>

网络最佳兼职

假如你想创业但资金不多或想找个兼职请看这 与您现有的工作相容互补而不冲突             不需要受学历的限制        不需要特殊的专业技能        不需要受 ...…

查看全部问答>

关于BGA布线扇出问题求解

最近想布一个BGA芯片的板子,但是看很多的bga芯片扇出的都是过孔 为什么扇出的是过孔呢,如果扇出一部分盲孔的话岂不是更容易布线吗, 我看一些电脑主板或显卡等一时这样的,扇出全是过孔,这样要浪费很多 的布线,而且听说盲孔比过孔更能提高板 ...…

查看全部问答>

哪里有SN8P1929资料?谢谢

本帖最后由 paulhyde 于 2014-9-15 09:21 编辑 哪里有SN8P1929资料?谢谢  …

查看全部问答>

请教一下DSP2812与RTL8019进行以太网通讯问题请教,谢谢了!

菜鸟刚开始使用DSP,想请教各位高手一下,DSP2812与8019网卡芯片是如何进行数据传输的,并且如何实现的通过2812给8019的寄存器进行配置? 我看了份示例代码,其中直接在DPS程序中,按照8019寄存器地址进行了宏定义的17个地址空间,当传输数据时, ...…

查看全部问答>