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;
}
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驱动注册