Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1052314
  • 博文数量: 166
  • 博客积分: 10217
  • 博客等级: 上将
  • 技术积分: 2133
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 19:45
文章分类

全部博文(166)

文章存档

2012年(3)

2011年(7)

2010年(18)

2009年(59)

2008年(79)

我的朋友

分类: LINUX

2008-04-25 17:58:23

<< 2410的初始化过程>>一文中我们看到了2410下的片上设备如何被添加到系统并和驱动配合使用的, 本文以RTC设备为例详细描述这个过程.

首先在arch/arm/s3c-2410/devs.c下添加静态描述的RTC设备资源及代表RCT设备的platform_device对象.

/* RTC */

static struct resource s3c_rtc_resource[] = {   /*RTC资源*/

    [0] = {

        .start = S3C24XX_PA_RTC,         /*RTC寄存器的物理起始地址*/

        .end   = S3C24XX_PA_RTC + 0xff,

        .flags = IORESOURCE_MEM,    /*资源类型*/

    },

    [1] = {

        .start = IRQ_RTC,   /*中断号*/

        .end   = IRQ_RTC,

        .flags = IORESOURCE_IRQ, /*资源类型*/

    },

    [2] = {

        .start = IRQ_TICK, /*中断号*/

        .end   = IRQ_TICK,

        .flags = IORESOURCE_IRQ /*资源类型*/

    }

};

 

struct platform_device s3c_device_rtc = {   /*RTC设备*/

    .name         = "s3c2410-rtc",  /*设备名必须与驱动中的名字一致*/

    .id       = -1,

    .num_resources    = ARRAY_SIZE(s3c_rtc_resource),  

    .resource     = s3c_rtc_resource,  /*资源*/

};

EXPORT_SYMBOL(s3c_device_rtc);

   其中资源中的寄存器地址是物理地址, 在驱动中得到后会用ioremap()来重映射.

接着要把这个RTC设备添加到系统中去, << 2410的初始化过程>>说过初始化时会把smdk_devs[]下的设备都添加到系统中去, 因此我们只要把RTC设备添加到这个数组中去就行了:

Static struct platform_device __initdata *smdk_devs[] = {

   &s3c_device_nand,

   ….

   & s3c_device_rtc  /*加进去就行了*/

}

这样在系统初始化时就会把RTC设备加到系统中去,  之后RTC驱动注册好后, 系统就会为它寻找匹配的设备(匹配的根据就是上文讲的设备名字). 驱动找到设备后也就找到了设备的所有资源(寄存器地址, 中断号), 也就可以通过这些资源来控制设备了. 具体RTC驱动可参考<< 2410rtc驱动分析>>

阅读(1143) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~