您的位置:首页 > 运维架构 > Linux

嵌入式Linux之我行——s3c2440的IO静态映射的分析

2011-08-13 13:34 399 查看
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。
共享资源,欢迎转载:http://blog.chinaunix.net/u2/71164/showart_1880000.html 

内存映射分3个层次:
开发板的层次(如:声卡,网卡和开发板相关的部分)
最小系统的层次(系统必需的几个,如GPIO,IRQ,MEMCTRL,UART)
其他系统的层次(不影响开机的部分,如:usb,lcd,adc)
  开发板的mapio的初始化: 

  smdk2440_map_io函数中会调用:

  s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
  而开发板相关的内存映射在smdk2440_iodesc,有ISA,声卡,网卡等。定义如下:
  static struct map_desc smdk2440_iodesc[] __initdata = {

    /* ISA IO Space map (memory space selected by A24) */
    { (u32)S3C24XX_VA_ISA_WORD, S3C2410_CS2, SZ_16M, MT_DEVICE },

    { (u32)S3C24XX_VA_ISA_BYTE, S3C2410_CS2, SZ_16M, MT_DEVICE },

  };

 
  最小系统的io初始化:

  s3c24xx_init_io函数会调用:

  iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));

  而最小系统相关的io映射在s3c_iodesc,定义如下:
  static struct map_desc s3c_iodesc[] __initdata = {

    IODESC_ENT(GPIO),

    IODESC_ENT(IRQ),

    IODESC_ENT(MEMCTRL),

    IODESC_ENT(UART)

  };

  这个部分是系统启动必须的映射。后续会调用(cpu->map_io)(mach_desc, size);来完成其他映射。

  这个函数会调用:
  iotable_init(s3c2440_iodesc, ARRAY_SIZE(s3c2440_iodesc));

  定义如下:

  static struct map_desc s3c2440_iodesc[] __initdata = {

    IODESC_ENT(USBHOST),

    IODESC_ENT(USBDEV),

    IODESC_ENT(CLKPWR),

    IODESC_ENT(LCD),

    IODESC_ENT(TIMER),

    IODESC_ENT(ADC),

    IODESC_ENT(WATCHDOG),

  };

  综合上述发现,如果一个新加驱动,首先要看是否完成了IO映射,如果没有的话,就在开发板部分加入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  嵌入式 io linux c struct timer