linux 2.6.32.2 mini2440平台移植--内核移植、yaffs2文件系统移植

发布者:码梦小子最新更新时间:2022-10-18 来源: csdn关键字:linux  6  mini2440  平台移植  内核移植  yaffs2 手机看文章 扫描二维码
随时随地手机看文章

1.1 获取Linux内核源代码


有很多方式可以获取Linux内核源代码,如果你的linux平台可以上互联网,可以直接在命令行输入以下命令获取到Linux-2.6.32.2:


#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz


当然你也可以先在Windows系统下使用迅雷等工具下载完,再复制到linux中。


1.2 解压内核源代码


假定我们刚才把内核源代码下载到了/root/mini2440目录,执行以下解压命


令:


#cd  /opt/FriendlyARM/mini2440


#tar  xvzf  linux-2.6.32.2.tar.gz


1.3 指定交叉编译变量


我们移植目的是让Linux-2.6.32.2可以在mini2440上运行。


首先,我们要使得Linux-2.6.32.2的缺省目标平台成为ARM的平台。


修改总目录下的Makefile



export KBUILD_BUILDHOST := $(SUBARCH)


ARCH  ?= $(SUBARCH)


CROSS_COMPILE ?= 


改为


export KBUILD_BUILDHOST := $(SUBARCH)


ARCH  ?= arm


CROSS_COMPILE ?= arm-linux-


其中,ARCH是指定目标平台为arm,CROSS_COMPILE是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。


接下来,要测试一下linux的编译是否能正常通过。


执行:


#make s3c2410_defconfig ;使用缺省内核配置文件,s3c2410_defconfig是SMDK2440的缺省配置文件,我的s3c2410_defconfig文件位于/arch/arm/configs/s3c2410_defconfig


#make ;编译时间较长


编译通过,在此我们先不必烧写到开发板验证它的正确性。


1.4 克隆建立自己的目标平台


1.4.1关于机器码


以上编译是用的Linux内核本身支持的目标平台配置,它对应于SMDK2440。现在我们要参考SMDK2440加入自已的开发板平台,我们使用的是mini2440,因此取名为MINI2440。需要说明的是,Linux-2.6.32.2本身已经包含了mini2440的支持,这样就出现了重名。那怎么办呢?在此我们依然使用MINI2440这个名称,只不过在后面的移植步骤中,把原始内核自带的mini2440代码部分直接删除就可以了,以免和我们自己移植的混淆了。首先,很关键的一点,内核在启动时,是通过bootloader传入的机器码(MACH_TYPE)确定应启动哪种目标平台的,友善之臂已经为mini2440申请了自己的机器码为1999,它位于linux-2.6.32.2/arch/arm/tools/mach_types文件中.


如果内核的机器码和bootloader传入的不匹配,就会经常出现下面的错误:


Uncompressing Linux.................................................................................................................................. done, booting


the kernel.


运行到这不就停住了


提示:在U-boot/include/asm-arm/mach-types.h中可以看到mini2440的机器码定义


接下来,我们注意到linux-2.6.32.2/arch/arm/mach-s3c2440目录下有个


mach-mini2440.c文件,它其实就是国外爱好者为mini2440移植添加的主要内容了,但我们不用它,把它直接删除。将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c复制一份。命名为mach-mini2440.c,


找到MACHINE_START(S3C2440, "SMDK2440"),修改为


MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")。


提示:开发板运行后,在命令行终端输入:cat /proc/cpuinfo 可以看到我们添加的开发板信息


1.4.2 修改时钟源频率


现在再来修改系统时钟源,在mach-mini2440.c(就是我们刚刚通过复制


mach-smdk2440.c得到的)的第160行static void __init smdk2440_map_io(void)函数中,把其中的16934400(代表原SMDK2440目标板上的晶振是16.9344MHz)改为mini2440开发板上实际使用的12,000,000(代表mini2440开发板上的晶振12MHz,元器件标号为X2)


1.4.3 从SMDK2440到MINI2440


因为我们要制作自己的mini2440平台体系,因此把mach-mini2440.c中所有的


smdk2440字样改为mini2440,可以使用批处理命令修改,在vim的命令模式下输入:


%s/smdk2440/mini2440/g


上面这句的意思是:把所有和“smdk2440”匹配的字符串全部替换为“mini2440”,前面的“%s“代表字符串匹配,最后的“g”代表global,是全局的意思,


除此之外,还有一个地方需要改动,在mini2440_machine_init(void)函数中,把


smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440原来的.


1.4.4 编译测试


在Linux源代码根目录下执行


#make mini2440_defconfig ;使用Linux官方自带的mini2440配置


#make zImage ;编译内核,时间较长,最后会生成zImage


我的s3c2410_defconfig文件位于/arch/arm/configs/mini2440_defconfig


重新编译并把生成的内核文件zImage(位于arch/arm/boot目录)下到板子中,可以看到内核已经可以正常启动了,但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆。


注意:


(1)如果你先前已经编译过内核了,请先清理一下,不然会提示编译的文件过时了。


(2)注意在先前关于机器码一项时修改的MACHINE_START(S3C2440, "SMDK2440"),修改为


MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")。


这里的MINI2440必须要大写,我自己的理解是跟机器码里面的类型一致。


1.5 关于内核配置菜单中的mini2440选项


在开始移植其他驱动之前,我们再了解一些看起来比较“神秘”的常识,那就是运行make menuconfig时,内核配置菜单中的mini2440选项是如何出现的。


在命令行执行:


#make menuconfig  ;前面已经执行了make mini2440_defconfig加载了缺省配置,因此这里可以直接执行该命令


按上下键移动到System Type,按回车进入该子菜单,再找到S3C2440 Machines,按回车进入该子菜单


在此就可以看到Linux天生内核对mini2440开发板的支持选项了,那么它们是从哪里来的呢?


打开Linux-2.6.32.2/arch/arm/mach-s3c2440/Kconfig文件可以找到相关信息。


现在明白了吧,“MINI2440 development board”正是在这个Kconfig文件中定义说明的,


当然你可以根据自己的喜好改为其他显示信息。


这里的显示信息只是在内核配置菜单中出现的,要让选择的配置实际起效,还需要根据此配置在Makefile中添加相应的代码文件,请看该目录下的Makefile。


这样,配置文件就跟实际的代码文件通过配置定义联系在一起了,这里的配置定义是“CONFIG_MACH_MINI2440”,内核中还有很多类似的配置定义,并且有的配置定义还存在依赖关系,我们在此就不对它们详细说明了,随着对内核代码结构的不断熟悉,你就会逐渐学会分析和查找你所需要的各种配置和定义等。


1.6 移植Nand驱动并更改分区信息


1.6.1 Linux-2.6.32.2内核所支持的Nand Flash类型


Linux2.6.32.2已经自带了大部分Nand Flash驱动,在


linux-2.6.32.2/drivers/mtd/nand/nand_ids.c文件中,定义了所支持的各种Nand Flash类型。


1.6.2 修改Nand Flash分区表


但是系统默认的分区不是我们所需的,所以要自已修改,除此之外,还有Nand Flash的结构信息需要增加填写,以便能够适合系统自带的Nand Flash驱动接口,这可以参考SMDK2440中关于Nand Flash设备注册的一些信息。


打开/arch/arm/plat-s3c24xx/common-smdk.c,可以看到这样一个结构体:


注意这里是参考这个文件夹的内容,改动还是在mach-mini2440.c


static struct mtd_partition smdk_default_nand_part[] = {


        [0] = {


                .name   = "Boot Agent",


                .size   = SZ_16K,


                .offset = 0,


        },


        [1] = {


                .name   = "S3C2410 flash partition 1",


                .offset = 0,


                .size   = SZ_2M,


        },


        [2] = {


                .name   = "S3C2410 flash partition 2",


                .offset = SZ_4M,


                .size   = SZ_4M,


        },


        [3] = {


                .name   = "S3C2410 flash partition 3",


                .offset = SZ_8M,


                .size   = SZ_2M,


        },


        [4] = {


                .name   = "S3C2410 flash partition 4",


                .offset = SZ_1M * 10,


                .size   = SZ_4M,


        },


        [5] = {


                .name   = "S3C2410 flash partition 5",


                .offset = SZ_1M * 14,


                .size   = SZ_1M * 10,


        },


        [6] = {


                .name   = "S3C2410 flash partition 6",


                .offset = SZ_1M * 24,


                .size   = SZ_1M * 24,


        },


        [7] = {


                .name   = "S3C2410 flash partition 7",


                .offset = SZ_1M * 48,


                .size   = SZ_16M,


        }


};


这其实就是Nand Flash的分区表,在Linux-2.6.32.2中,nand驱动是被注册为平台设备的,这同样可在/arch/arm/plat-24xx/common-smdk.c文件中看出,如下:


static struct s3c2410_platform_nand smdk_nand_info = {


        .tacls          = 20,


        .twrph0         = 60,


        .twrph1         = 20,


        .nr_sets        = ARRAY_SIZE(smdk_nand_sets),


        .sets           = smdk_nand_sets,


};



/* devices we initialise */


static struct platform_device __initdata *smdk_devs[] = {


        &s3c_device_nand,


        &smdk_led4,


        &smdk_led5,


        &smdk_led6,


        &smdk_led7,


};


参考以上结构信息,我们也在自己的mach-mini2440.c中照此添加实现,同时需要参考友善之臂原厂内核中的Nand分区表


因此,在mach-mini2440.c中加入以下代码:


首先添加几个头文件:


#include

#include

#include

#include


#include  


然后加入以下代码:

static struct mtd_partition mini2440_default_nand_part[] = {


        [0] = {


                .name   = "supervivi", //这里是bootloader所在的分区,可以放置u-boot, supervivi等内容,对应/dev/mtdblock0


                .size   = 0x00040000,


                .offset = 0,


        },


        [1] = {


                .name   = "param", //这里是supervivi的参数区,其实也属于bootloader的一部分,如果u-boot比较大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1


                .offset = 0x00040000,


                .size   = 0x00020000,


        },


        [2] = {


                .name   = "Kernel", //内核所在的分区,大小为5M,足够放下大部分自己定制的巨型内核了,比如内核使用了更大的Linux Logo图片等,对应/dev/mtdblock2


                .offset = 0x00060000,


                .size   = 0x00500000,


        },


        [3] = {


                .name   = "root", //文件系统分区,友善之臂主要用来存放yaffs2文件系统内容,对应/dev/mtdblock3


                .offset = 0x00560000,


                .size   = 1024 * 1024 * 1024, //


        },


        [4] = {


                .name   = "nand", //此区域代表了整片的nand flash,主要是预留使用,比如以后可以通过应用程序访问读取/dev/mtdblock4就能实现备份整片nand flash了。


                .offset = 0x00000000,


                .size   = 1024 * 1024 * 1024, //


        }


};


//这里是开发板的nand flash设置表,因为板子上只有一片,因此也就只有一个表


static struct s3c2410_nand_set mini2440_nand_sets[] = {

[1] [2]
关键字:linux  6  mini2440  平台移植  内核移植  yaffs2 引用地址:linux 2.6.32.2 mini2440平台移植--内核移植、yaffs2文件系统移植

上一篇:linux2.6.32.2 mini2440平台移植--移植DM9000网卡驱动
下一篇:linux2.6.32.2 mini2440平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植

推荐阅读最新更新时间:2024-11-05 22:01

4412 Linux设备总线
总线_设备_驱动注册流程详解 注册流程图 • 设备一般都需要先注册,才能注册驱动 – 现在越来越多的热拔插设备,反过来了。先注册驱动,设备来了再注册 设备 • 本节使用的命令 – 查看总线的命令#ls /sys/bus/ – 查看设备号的命令#cat /proc/devices • 设备都有主设备号和次设备号,否则255个设备号不够用 – 查看杂项设备号的命令#cat /proc/misc 二、总线设备注册 关于注册设备的一点说明 • 早先的Linux会使用单独的文件注册设备,现在大多是使用引入的虚拟平台,使用虚拟平台来注册设备会容易很多 • 如果大家在网上看到大段的注册设备的代码,可简单了解一下,知道有这么个东西就成,
[单片机]
4412 <font color='red'>Linux</font>设备总线
STM32单片机的FSMC对TFT的驱动
一、FSMC之我见 开始只是谈到别人对FSMC的理解,注意这里只讨论FSMC控制TFT,也就是在FSMC的NORPSRAM模式控制LCD,所以我们以下的分析都是基于这种模式的。 1、我们之前通过使用GPIO来模拟8080/6800时序从而达到驱动彩屏的,同样需要明白的一点就是我们也只是使用FSMC来模拟8080/6800时序,只不过这个读写速度有些快(使用了总线嘛),仅此而已! 简单一点就是:8080是通过“读使能(RE)”和“写使能(WE)”两条控制线进行读写操作。 6800是通过“总使能(E)”和“读写选择(W/R)”两条控制线进行 2、那么了解到FSMC的三总线如下! 数据线:这个可以分为8位的和16位,这个不难
[单片机]
STM<font color='red'>32</font>单片机的FSMC对TFT的驱动
带I2C接口的数字温度传感器TMP101及其应用
摘要:TMP101是TI公司生产的12位低功耗、高精度数字温度传感器,较宽的温度测量范围和较高的分辨率使其可以广泛应用于许多温度测量场合。TMP101可通过串行总线接口方便地与数字系统相连,同时还具有关闭模式和报警输出。文中介绍了TMP101的内部结构和主要特性,并给出了与PrPMC800模块的接口应用。 关键词:温度传感器;I2C;SMBus;PrPMC800;TMP101 1 TMP101的引脚功能和主要特性 TMP101是TI公司生产的12位低功耗、高精度的数字温度传感器它采用与I2C和SMBus相兼容的2线数字接口,可应用于许多高分辨率和宽量程温度测量场合,如温度控制系统、个人计算机保护、电子测试仪器、办公设备以
[传感技术]
STM32F429和F103端口重映射
它自己默认每个管脚有自己的复用功能,但是这个管脚你用了,但你想要用它的其他功能,你就可以将这个功能重映射到其他管脚。使用复用功能是要保持一个功能使能,其他功能非使能状态 重映射指的是内部功能转移到别的引脚上去,芯片内部已经固定了只能映射到固定的地方。若使用TIM3重映射到其他引脚上,则先要配置TIM3重映射到该引脚,然后在按该引脚的复用功能配置 F103重映射实例: 1.打开重映射时钟和USART重映射后的I/O口引脚时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能对应IO口的时钟,因为是复用功能所以
[单片机]
STM<font color='red'>32</font>F429和F103端口重映射
STM32单片机的FSMC机制FlaSh存储器扩展
   引 言   STM32是ST(意法半导体)公司推出的基于ARM内核Cortex-M3的32位微控制器系列。Cortex-M3内核是为低功耗和价格敏感的应用而专门设计的,具有突出的能效比和处理速度。通过采用Thumb-2高密度指令集,Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32系列微控制器能够以更优越的性价比,面向更广泛的应用领域。   STM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。STM32系列采用一种新型的存储器扩展技术——FSMC,在外部存储器扩展方面具有
[单片机]
高通第2款4nm芯片来了!OPPO首发骁龙7 Gen1
今天,博主@数码闲聊站爆料,OPPO Reno8系列有三款机型,小杯搭载联发科天玑1300,中杯搭载骁龙7 Gen1,大杯搭载联发科天玑8100。   其中中杯是OPPO Reno8,型号为PGAM10,该机会首发骁龙7 Gen1处理器,这颗芯片将在本月正式登场。   和骁龙778G对比,骁龙7 Gen1升级为4nm工艺制程,这是高通旗下第二款4nm手机芯片(第一款是骁龙8 Gen1)。   OPPO Reno8跑分,首发骁龙7 Gen1   这颗芯片由4颗大核和4颗小核组成,大核为ARM Cortex A710,CPU主频为2361MHz,小核为ARM Cortex A510,CPU主频为1804MHz,GPU为Adre
[手机便携]
高通第<font color='red'>2</font>款4nm芯片来了!OPPO首发骁龙7 Gen1
STC12C5A60S2单片机-双串口通信
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。 芯片:STC12C5A60S2 晶振:22.1184MHz 波特率:9600bps 引脚定义:串行口1: 发送————TxD/P3.1; 接收————RxD/P3.0 串行口2: 发送————TxD2/P1.3;接收————RxD2/P1.2 功能描述:STC12双串口通信(中断方
[单片机]
stm32的RTC操作
分为两个文件: rtc.c /******************************************************************************* * 文件名 :rtc.c * 描述 :wit_yuan * 论坛 : **********************************************************************************/ #include rtc.h #include stdio.h #include misc.h uint8_t const *WEEK_STR = { 日 , 一 , 二 , 三 , 四 , 五
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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