iic总线驱动(适配器驱动)详解

本文详细介绍了Linux系统中I2C总线驱动设备资源的添加,包括平台数据初始化、平台设备注册以及I2C驱动的注册过程。内容涵盖s3c2410_platform_i2c结构体的使用、平台资源的配置、驱动程序的probe函数以及I2C总线初始化等关键步骤。
摘要由CSDN通过智能技术生成

linux系统下,不管什么设备(总线驱动总线设备驱动..),挂接在总线上都分两种资源:1.驱动设备资源(驱动设备资源注册)2.驱动(针对设备的驱动注册)

所以在实现和学习驱动的时候,就分这两块来进行。

一:我会查找i2c驱动设备资源添加(i2c适配器平台资源)

//Mach-mini2440.c (arch\arm\mach-s3c24xx)

(1)

//平台数据

struct s3c2410_platform_i2c default_i2c_data __initdata = {
.flags= 0,
.slave_addr= 0x10,//从机地址
.frequency= 100*1000,//总线工作频率
.sda_delay= 100, //数据传输延时
};

s3c_i2c0_set_platdata(NULL);//平台数据设置

s3c_i2c0_set_platdata()函数将S3C2440上的I2C控制器进行了一些初始化,但是并没有写入硬件寄存器,仅仅是保存在了s3c2410_platform_i2c结构体中

void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)
{
struct s3c2410_platform_i2c *npd;
if (!pd) {
pd = &default_i2c_data;
pd->bus_num = 0;
}
npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
      &s3c_device_i2c0);

/* s3c_i2c0_cfg_gpio为 配置I2C控制器GPIO函数指针 */
if (!npd->cfg_gpio)
npd->cfg_gpio = s3c_i2c0_cfg_gpio;
}

void __init *s3c_set_platdata(void *pd, size_t pdsize,
     struct platform_device *pdev)
{
void *npd;
if (!pd) {
/* too early to use dev_name(), may not be registered */
printk(KERN_ERR "%s: no platform data supplied\n", pdev->name);
return NULL;
}
npd = kmemdup(pd, pdsize, GFP_KERNEL);
if (!npd) {
printk(KERN_ERR "%s: cannot clone platform data\n", pdev->name);
return NULL;
}
/*最后将struct device 中的platform_data指针直指向了初始化后的 s3c2410_platform_i2c结构体  */
pdev->dev.platform_data = npd;
return npd;
}


(2)

platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));

主要是将开发平台的设备注册进了系统,也就是将device注册到了platform虚拟的总线上,并进行了一些初始化的工作

-》platform_device_register(devs[i]);-》device_initialize(&pdev->dev)-》

将设备加入到平台中。mini2440_devices包含所有的划分为平台的总线驱动设备的资源,其中包括&s3c_device_i2c0

//Devs.c (arch\arm\plat-samsung)

//平台资源

static struct resource s3c_i2c0_resource[] = {
[0] = DEFINE_RES_MEM(S3C_PA_IIC, SZ_4K),//i2c控制器寄存器的地址范围
[1] = DEFINE_RES_IRQ(IRQ_IIC),//中断号
};
//平台资源
struct platform_device s3c_device_i2c0 = {

/*设备名,platform总线的match函数中会用设备名和驱动名的比较来绑定设备和驱动程序*/
.name = "s3c2410-i2c",
#ifdef CONFIG_S3C_DEV_I2C1
.id = 0,
#else
.id = -1,
#endif
.num_resources= ARRAY_SIZE(s3c_i2c0_resource),
.resource = s3c_i2c0_resource,
};


以上就是编写i2c总线驱动的时候,需要构造的总线驱动设备资源。

上面是一些板级的硬件设备资源向系统的注册,没有设计到具体的硬件操作,在加载驱动程序时,驱动程序会根据已经注册到系统的具体设备的硬件资源进行初始化,也就是进行一些硬件操作,控制硬件设备的正常工作,下面来分析驱动程序的加载过程。

二:i2c驱动注册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值