S3C2440 2.6.29 内核移植详解

本文详细介绍了如何将Linux 2.6.29.4内核移植到Mini2440开发板上,包括修改顶层Makefile、时钟配置、NAND Flash分区、添加DM9000网卡驱动等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       内核版本为linux-2.6.29.4,目标开发板为mini2440开发板

源码下载:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.4.tar.bz2

 

移植步骤:

1, 修改顶层Makefile

           ARCH ?= $(SUBARCH)
            CROSS_COMPILE ?=
   改为:
           ARCH ?= arm
              CROSS_COMPILE ?=arm-linux-

2, 修改时钟

smdk2440的晶振与mini2440的配置的不同。

vi  arch/arm/mach-s3c2440/mach-smdk2440.c      

    static void __init smdk2440_map_io(void)

{

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

/*modified by xxx,************************************************************/

s3c24xx_init_clocks(12000000); //mini2440配置的为12MHZ的晶振     

s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}

3, 修改nandflash的分区信息。要确保跟bootloader的分区信息移植。

 vi  arch/arm/plat-s3c24xx/common-smdk.c

   /*modifiedby xxx ,for 2440**************************************************/

static struct mtd_partitionsmdk_default_nand_part[] = {

       [0]= {                                              //对应 /dev/mtdblock0

              .name      = "U-Boot",

              .size = 0x40000,

              .offset     = 0,

       },

       [1]= {                                       /对应 /dev/mtdblock1

              .name      = "U-Boot_env",

              .offset= 0x40000,

              .size = 0x20000,

       },

       [2]= {                                              /对应 /dev/mtdblock2

              .name      = "Kernel",

              .offset= 0x60000,

              .size = 0x500000,

       },

       [3]= {                                       /对应 /dev/mtdblock3

              .name      = "Root",

              .offset     = 0x560000,

              .size = 1024*1024*1024,

       },

};

4,添加DM9000网卡驱动

 vi  arch/arm/mach-s3c2440/mach-smdk2440.c

 

static struct platform_device *smdk2440_devices[ ] __initdata = {

       &s3c_device_usb,

       &s3c_device_lcd,

       &s3c_device_wdt,

       &s3c_device_i2c0,

       &s3c_device_iis,

/*add by xxxxx ,for mini2440*******************************************************/

       &s3c_device_dm9000,

       &s3c_device_rtc,

};

 

修改arch/arm/plat-s3c24xx/devs.c

/*add by xxx ,for mini2440 dm9000*****************************************/

#include<linux/dm9000.h>

#define DM9000_BASE 0x20000300

static struct resource s3c_dm9000_resource[ ]={

       [0]={                                     

              .start=DM9000_BASE,

              .end  =DM9000_BASE+0x03,

              .flags=IORESOURCE_MEM,

       },

       [1]={

              .start=DM9000_BASE+0x04,

              .end  =DM9000_BASE+0x04+0x7c,

              .flags=IORESOURCE_MEM,

       },

       [2]={

              .start=IRQ_EINT7,

              .end  =IRQ_EINT7,

              .flags=IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,

       },

};

 

static struct dm9000_plat_data s3c_device_dm9000_platdata={

       .flags=DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,

};

 

struct platform_device s3c_device_dm9000={

       .name="dm9000",

       .id=0,

       .num_resources=ARRAY_SIZE(s3c_dm9000_resource),

       .resource=s3c_dm9000_resource,

       .dev={

       .platform_data=&s3c_device_dm9000_platdata,

       }

};

EXPORT_SYMBOL(s3c_device_dm9000);

/*end add**********************************************************************/

 

修改arch/arm/plat-s3c/include/plat/devs.h

extern struct s3c24xx_uart_resources s3c2410_uart_resources[];

后面添加:

extern struct platform_device s3c_device_dm9000;

 

5,配置及编译内核

 # Make s3c2410_defconfig   //使用s3c2410的默认配置

#make menuconfig               //只需修改下面几项

[*] Enable loadable module support --->

       [*]   Module unloading

      选择这一个,剩下的可以去掉

System Type ---->

       [*] S3C2410 DMA support

       S3C2440 Machines --->

              [*] SMDK2440

              [*] SMDK2440 with S3C2440 CPU module

//System Type这部分,只选这些,其他可以全部去掉,

Boot option ----->

    修改启动参数为:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

    可能根据个人板子的设置会不一样,我的是从Nand Flash中加载文件系统,其中mtdblock2(即添加的nand分区smdk_default_nand_part[2])是存放我的Linux文件系统的分区。不过,在bootloader可以传递内核参数的情况下这个设置是无效的。

 

Device Drivers --->

       <*> Memory Technology Device (MTD) support --->

                  [*]   MTD partitioning support

                  <*> NAND Device Support --->

                                <*>   NAND Flash support for S3C2410/S3C2440 SoC

                                 [ ]    S3C2410 NAND Hardware ECC     //去除ECC校验

       [*] Network device support --->

                   [*]   Ethernet (10 or 100Mbit) ---> 

                                  <*>   DM9000 support
Kernel Features ->
     [*]Use the ARM EABI to compile the kernel
     [*]  Allow old ABI binaries to run with this kernel

至此,修改完毕,重新编译即可


若启动过程出现

UncompressingLinux......................................................................................done, booting the kernel.

并提示machine 号码不匹配的情况,这是因为我们直接在mach-smdk2440.c中修改的代码,导致我们的开发板型号被误认为 smdk2440所致。

我们来看一下mach-smdk2440.c的最后一段代码:

vi arch/arm/mach-s3c2440/mach-smdk2440.c

在最后定义了这样的宏:

 MACHINE_START(S3C2440 , ”SMDK2440”)

···

 MACHINE_END

该宏在  arch/arm/include/asm/mach/arch.h中有如下定义:

 #define MACHINE_START(_type,_name)                        \
        static const struct machine_desc __mach_desc_##_type        \
         __attribute_used__                                        \
          __attribute__((__section__(".arch.info.init"))) = {        \
                 .nr                = MACH_TYPE_##_type,                \
                 .name                = _name,
        
         #define MACHINE_END                                \
         };    

最后展开来也就是:

.nr=MACH_TYPE_S3C2440

.name=SMDK2440    

而关于开发板的信息在arch/arm/include/asm/mach/arch.h中也有定义:

struct machine_desc {

unsigned int nr;             /*architecture number*/

 ```

const char   *name:        /*architecture name*/

}

从以上分析可知,我们的开发板定义成了SMDK2440开发板,而不是mini2440。

这里.nr=MACH_TYPE_S3C2440

也就是说S3C2440就是machine ID的代号,具体值定义在 
在arch/arm/tools/mach-types中
s3c2440 ARCH_S3C2440 S3C2440 362
原来我们的machine ID是362~
那bootloader传递进来的值是多少呢?~
Error: unrecognized/unsupported machine ID (r1 = 0x000007cf).
注意到没有?~ 0x7CF转换成10进制也就是1999(即mini2440的machine ID)

所以只要修改内核的 arch/arm/tools/mach-types文件中的如下项即可

s3c2440        ARCH_3C2440           S3C2440      1999

 


内核支持yafffs文件系统:

       可以使用git工具下载yaffs工具,也可以直接在这里下载:

http://download.youkuaiyun.com/detail/fengyaqi123/4525414

解压后,进入yaffs2文件夹

#cd yaffs2

#./patch-ker.sh c/home/xxx/Documents/linux-2.6.29.4

然后

#make menuconfig

 FileSystems-->

              [*]Miscellaneousfilesystems--->

                                   [*]YAFFS2file system support

退出配置,重新编译即可

#make uImage

 

参考:http://www.linuxidc.com/Linux/2011-04/34979.htm


附:

由于2.6.29自带的dm9000的驱动不完善,完成会根文件系统的移植后,开发板ping主机时会出现严重的丢包现象,将友善的dm9000.c和dm9000.h文件拷过来覆盖即可。

       


内容概要:本文围绕直流微电网中带有恒功率负载(CPL)的DC/DC升压转换器的稳定控制问题展开研究,提出了一种复合预设性能控制策略。首先,通过精确反馈线性化技术将非线性不确定的DC转换器系统转化为Brunovsky标准型,然后利用非线性扰动观测器评估负载功率的动态变化和输出电压的调节精度。基于反步设计方法,设计了具有预设性能的复合非线性控制器,确保输出电压跟踪误差始终在预定义误差范围内。文章还对比了多种DC/DC转换器控制技术如脉冲调整技术、反馈线性化、滑模控制(SMC)、主动阻尼法和基于无源性的控制,并分析了它们的优缺点。最后,通过数值仿真验证了所提控制器的有效性和优越性。 适合人群:从事电力电子、自动控制领域研究的学者和工程师,以及对先进控制算法感兴趣的研究生及以上学历人员。 使用场景及目标:①适用于需要精确控制输出电压并处理恒功率负载的应用场景;②旨在实现快速稳定的电压跟踪,同时保证系统的鲁棒性和抗干扰能力;③为DC微电网中的功率转换系统提供兼顾瞬态性能和稳态精度的解决方案。 其他说明:文中不仅提供了详细的理论推导和算法实现,还通过Python代码演示了控制策略的具体实现过程,便于读者理解和实践。此外,文章还讨论了不同控制方法的特点和适用范围,为实际工程项目提供了有价值的参考。
内容概要:该论文介绍了一种名为偏振敏感强度衍射断层扫描(PS-IDT)的新型无参考三维偏振敏感计算成像技术。PS-IDT通过多角度圆偏振光照射样品,利用矢量多层光束传播模型(MSBP)和梯度下降算法迭代重建样品的三维各向异性分布。该技术无需干涉参考光或机械扫描,能够处理多重散射样品,并通过强度测量实现3D成像。文中展示了对马铃薯淀粉颗粒和缓步类动物等样品的成功成像实验,并提供了Python代码实现,包括系统初始化、前向传播、多层传播、重建算法以及数字体模验证等模块。 适用人群:具备一定光学成像和编程基础的研究人员,尤其是从事生物医学成像、材料科学成像领域的科研工作者。 使用场景及目标:①研究复杂散射样品(如生物组织、复合材料)的三维各向异性结构;②开发新型偏振敏感成像系统,提高成像分辨率和对比度;③验证和优化计算成像算法,应用于实际样品的高精度成像。 其他说明:PS-IDT技术相比传统偏振成像方法具有明显优势,如无需干涉装置、无需机械扫描、可处理多重散射等。然而,该技术也面临计算复杂度高、需要多角度数据采集等挑战。文中还提出了改进方向,如采用更高数值孔径(NA)物镜、引入深度学习超分辨率技术等,以进一步提升成像质量和效率。此外,文中提供的Python代码框架为研究人员提供了实用的工具,便于理解和应用该技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值