原创 【原】Linux-2.6.24移植到SBC2440

2009-10-8 09:45 4997 9 9 分类: MCU/ 嵌入式

PC机环境:Ubuntu 8.04
交叉编译器:arm-linux-gcc 3.4.5
Linux内核源码包:linux-2.6.24.tar.bz2
=============================================
第一阶段
=============================================
1)、修改Makefile
ARCH  ?= arm
CROSS_COMPILE ?= arm-linux-
2)、将内核的machine id改成和bootloader一至。uboot的mach id为5244,将
include/asm/mach-types.h中的MACH_TYPE_S3C2440定义为:
#define MACH_TYPE_S3C2440              5244
3)、将arch/arm/mach-s3c2440/mach-smdk2440.c中的
 s3c24xx_init_clocks(16934400);
改为:
 s3c24xx_init_clocks(12000000);
4)、配置及编译内核
先把默认配置文件拷贝过来
cp arch/arm/configs/s3c2410_defconfig .config
配置
Make menuconfig
 

  • Enable loadable module support --->
          
  •    Module unloading
          
  •    Automatic kernel module loading
           选择这两个,剩下的可以去掉
     
    System Type ---->
          
  • S3C2410 DMA support
          
  • Support ARM920T processor
           S3C2410 Machines --->
                 
  • SMDK2410/A9M2410
           S3C2440 Machines --->
                 
  • SMDK2440
                 
  • SMDK2440 with S3C2440 CPU module
     
    System Type这部分,只选这些,其他可以全部去掉。另外,网上一些帖子都说只选上SMDK2440就可以了,其他的都去掉,事实上是不行的,我试了多次,都在编译时
    到arch/arm/plat-s3c24xx/s3c24xx.o时,报错:
    arch/arm/plat-s3c24xx/s3c244x.c: In function `s3c244x_init_clocks':
    arch/arm/plat-s3c24xx/s3c244x.c:121: error: implicit declaration of function `s3c2410_baseclk_add'
    make[1]: *** [arch/arm/plat-s3c24xx/s3c244x.o] 错误 1
    make: *** [arch/arm/plat-s3c24xx] 错误 2
    我再选上SMDK2410/A9M2410,问题解决。
    此时编译好之后,可以看到内核的启动信息。
    =============================================
    第二阶段  网口驱动移植
    =============================================
    1)、在arch/arm/plat-s3c24xx/devs.c中添加头文件
    #include <linux/dm9000.h>
    2)、在源码中添加以下内容:
    /* DM9000 resource, add by xionggang */
    static struct resource dm9000_resource[] = {
     [0]= {
      .start = S3C2410_CS3 + 0x300,
      .end   = S3C2410_CS3 + 0x300 + 0x03,
      .flags  = IORESOURCE_MEM,
     },
     [1]={
      .start = S3C2410_CS3 + 0x300 + 0x04,
      .end   = S3C2410_CS3 + 0x300 + 0x04 + 0x3f,
      .flags = IORESOURCE_MEM,
     },
     [2]={
      .start = IRQ_EINT9,
      .end   = IRQ_EINT9,
      .flags = IORESOURCE_IRQ,
     }
    };


    static struct dm9000_plat_data dm9000_platdata ={
     .flags = DM9000_PLATF_16BITONLY,//work in 16bit mode
    };


    struct platform_device dm9000_device = {
     .name = "dm9000",
     .id = -1,
     .num_resources = 3,
     .resource = dm9000_resource,
     .dev = {
     .platform_data = &dm9000_platdata,
     }
    };
    EXPORT_SYMBOL(dm9000_device);
    3)、在arch/arm/mach-s3c2440/mach-smdk2440.c的结构体
    static struct platform_device *smdk2440_devices[] __initdata
    中添加
     &dm9000_device,
    变为:
    static struct platform_device *smdk2440_devices[] __initdata = {
     &s3c_device_usb,
     &s3c_device_lcd,
     &s3c_device_wdt,
     &s3c_device_i2c,
     &s3c_device_iis,
     &dm9000_device,
    };
    4)、在include/asm-arm/plat-s3c24xx/devs.h 中声明平台设备 eduk_dm9000_device ,在适当位置添加以下内容:
    extern struct platform_device dm9000_device;
    5)、修改drivers/net/dm9000.c,在前面加上
    static void *extint1;
    static void *intmsk;
    #define EXTINT1           (0x5600008c)
    #define INTMSK            (0x4A000008)
    在dm9000_probe(struct platform_device *pdev)中加上
     extint1=ioremap_nocache(EXTINT1,0x0000004);
     intmsk=ioremap_nocache(INTMSK,0x0000004);


     writel(readl(extint1)|0x40,extint1); //rising edge
     writel(readl(intmsk)&0xfff1,intmsk);
    重新编译,网口即通。


     


     


     


  • PARTNER CONTENT

    文章评论0条评论)

    登录后参与讨论
    EE直播间
    更多
    我要评论
    0
    9
    关闭 站长推荐上一条 /1 下一条