Linux I2C驱动(OMAP3630 ) omap_i2c_probe

  函数omap_i2c_probe的执行流程如下图: 

 


图3.2 omap_i2c_probe的执行流程

 


    函数omap_i2c_probe的简要代码如下:

static int __init   
omap_i2c_probe(struct platform_device *pdev)   
{   
    struct omap_i2c_dev *dev;   
    struct i2c_adapter  *adap;   
    struct resource     *mem, *irq, *ioarea;   
    irq_handler_t isr;   
    ……   
  
    /* NOTE: driver uses the static register mapping */  
    mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);   
    ……   
    irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);   
    ……   
    dev = kzalloc(sizeof(struct omap_i2c_dev), GFP_KERNEL);   
    ……   
    dev->dev = &pdev->dev;   
    dev->irq = irq->start;   
    dev->base = ioremap(mem->start, mem->end - mem->start + 1);   
    ……   
    /* reset ASAP, clearing any IRQs */  
    omap_i2c_init(dev);   
  
    isr = (dev->rev < OMAP_I2C_REV_2) ? omap_i2c_rev1_isr : omap_i2c_isr;   
    r = request_irq(dev->irq, isr, 0, pdev->name, dev);   
    ……   
    adap = &dev->adapter;   
    i2c_set_adapdata(adap, dev);   
    adap->owner = THIS_MODULE;   
    adap->class = I2C_CLASS_HWMON;   
    strncpy(adap->name, "OMAP I2C adapter", sizeof(adap->name));   
    adap->algo = &omap_i2c_algo;   
    adap->dev.parent = &pdev->dev;   
    /* i2c device drivers may be active on return from add_adapter() */  
    adap->nr = pdev->id;   
    r = i2c_add_numbered_adapter(adap);   
    ……   
    return 0;   
    ……   

     这里定义了I2C adapter的中断处理函数omap_i2c_isr(),该函数对I2C控制器的中断事件进行响应,主要实现了对I2C数据收发中断事件的处理。
     这边还涉及到了一个i2c_algorithm结构的变量omap_i2c_algo,该变量的定义如下:

static const struct i2c_algorithm omap_i2c_algo = {   
    .master_xfer    = omap_i2c_xfer,   
    .functionality  = omap_i2c_func,   
}; 

 omap_i2c_xfer接口函数实现了底层I2C数据传输的方法。

 omap_i2c_probe函数最后使用了   i2c_add_numbered_adapter()将adapter注册到i2c-core层,adapter的总线号保存在平台设备数组 omap_i2c_devices中,见3.1.1节,由于该数组中有三个成员,即三条I2C总线,所以这里会建立三个I2C adapter,总线号分别为1,2,3。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值