当前位置:  技术问答>linux和unix

S3C6410-ADC驱动

    来源: 互联网  发布时间:2017-02-06

    本文导语:  本帖最后由 LH806732 于 2010-11-01 23:45:12 编辑 我刚学linux,今天看第一个驱动ADC 在plat-s3c64xx目录下游个adc.c,代码(部分): static struct platform_driver s3c_adc_driver = {        .probe          = s3c_adc_probe,      ...

本帖最后由 LH806732 于 2010-11-01 23:45:12 编辑
我刚学linux,今天看第一个驱动ADC
在plat-s3c64xx目录下游个adc.c,代码(部分):


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 specifiedn");
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 regionn");
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() regionn");
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字样的呢?

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

|
这个是platform的driver和device的关系
在我的kernel中找到对应的楼主的代码。
armplat-s3c24xxadc.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应该是放在设备这个结构体中的。

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

简单说,这里仅仅是有描述驱动的数据结构
还应该有描述设备的数据结构
设备拥有的资源,是在描述设备的数据结构里保存的
所以 platform_get_resource(pdev, IORESOURCE_MEM, 0);
就能得到设备的IOMEM资源

|
居然没搜到,这哥们SEO没做好啊
http://blog.csdn.net/fudan_abc/

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • s3c2440-sdi s3c2440-sdi: unable to get DMA channel
  • 我使用了 s3c2410_defconfig 来配置linux 2.6.22.1,到uncompress kernel。。。。。done,start kerne
  • linux2.6.24.7 +s3c2440, 使用linux-2.6.24.7/driver/spi/spi_bitbang.c spi_s3c244xx.c,spidev.c,如何实现spi 的dma方式?
  • s3c2440-linux内核挂载启动不了yaffs2文件系统,请问怎么搞?两天快崩溃了。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3