首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

S3C6410-ADC驱动解决方法

2012-03-18 
S3C6410-ADC驱动我刚学linux,今天看第一个驱动ADC在plat-s3c64xx目录下游个adc.c,代码(部分):C/C++ codest

S3C6410-ADC驱动
我刚学linux,今天看第一个驱动ADC
在plat-s3c64xx目录下游个adc.c,代码(部分):

C/C++ code
static struct platform_driver s3c_adc_driver = {       .probe          = s3c_adc_probe,       .remove         = s3c_adc_remove,       .suspend        = s3c_adc_suspend,       .resume         = s3c_adc_resume,       .driver        = {        .owner    = THIS_MODULE,        .name    = "s3c-adc",    },};int __init s3c_adc_init(void){    printk(banner);    return platform_driver_register(&s3c_adc_driver);}static int __init s3c_adc_probe(struct platform_device *pdev){    struct resource    *res;    struct device *dev;    int ret;    int size;    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);    dev = &pdev->dev;    if(res == NULL){        dev_err(dev,"no memory resource specified\n");        return -ENOENT;    }    size = (res->end - res->start) + 1;#if !defined(ADC_WITH_TOUCHSCREEN)    adc_mem = request_mem_region(res->start, size, pdev->name);    if(adc_mem == NULL){        dev_err(dev, "failed to get memory region\n");        ret = -ENOENT;        goto err_req;    }#endif         /* 为什么下面这一句就得到了一个虚拟地址,我的意思是res->start为什么就代表了ADC基地址 */    base_addr = ioremap(res->start,size);    if(base_addr ==  NULL){        dev_err(dev,"fail to ioremap() region\n");        ret = -ENOENT;        goto err_map;    }    .    .    .}


为啥
static struct platform_driver s3c_adc_driver = {
  .probe = s3c_adc_probe,
  .remove = s3c_adc_remove,
  .suspend = s3c_adc_suspend,
  .resume = s3c_adc_resume,
  .driver= {
.owner= THIS_MODULE,
.name= "s3c-adc",
},
};
没有包含一个像.resource字样的呢?

本人是菜鸟,希望老手指点!

[解决办法]
plantform机制可不是三言两语讲得完的
设备 驱动 总线 这个模型理解了,才能解释这个问题
可以去看 复旦路人甲的博客

简单说,这里仅仅是有描述驱动的数据结构
还应该有描述设备的数据结构
设备拥有的资源,是在描述设备的数据结构里保存的
所以 platform_get_resource(pdev, IORESOURCE_MEM, 0);
就能得到设备的IOMEM资源
[解决办法]
居然没搜到,这哥们SEO没做好啊
http://blog.csdn.net/fudan_abc/
[解决办法]
这个是platform的driver和device的关系
在我的kernel中找到对应的楼主的代码。
arm\plat-s3c24xx\adc.c中
static struct platform_driver s3c_adc_driver = {
.driver= {
.name= "s3c24xx-adc",
.owner= THIS_MODULE,
},
.probe= s3c_adc_probe,
.remove= __devexit_p(s3c_adc_remove),
.suspend= s3c_adc_suspend,
.resume= s3c_adc_resume,
};
有这样的一个设备驱动,名字叫做s3c24xx-adc,
在同一个目录的devs.c中可以看到这样的代码:
/* ADC */

static struct resource s3c_adc_resource[] = {
[0] = {
.start = S3C24XX_PA_ADC,
.end = S3C24XX_PA_ADC + S3C24XX_SZ_ADC - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_TC,
.end = IRQ_TC,
.flags = IORESOURCE_IRQ,
},
[2] = {
.start = IRQ_ADC,
.end = IRQ_ADC,
.flags = IORESOURCE_IRQ,
}

};

struct platform_device s3c_device_adc = {
.name = "s3c24xx-adc",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_adc_resource),
.resource = s3c_adc_resource,
};
这里有一个platform_device的结构体,表示设备,platform是一个虚拟的总线,类似于pc的PCI,上面可以挂载设备,设备和驱动有一定的匹配关系,应该是name的匹配。
resource应该是放在设备这个结构体中的。

热点排行