eeprom设备驱动(client driver)详解(二)

在注册i2c驱动i2c_driver的时候,会去linux系统中的全局变量__i2c_board_list链表中去匹配i2c_client,匹配的条件是:名字和i2c的地址。所以在注册i2c设备驱动的时候要先注册好i2c设备。


设备驱动负责完成在iic总线中注册iic设备的驱动,既调用i2c_add_driver函数,当iic总线适配器(adpater)注册时,会扫描__i2c_board_list链表,将对应总线的设备(client)注册,
总线上设备(client)与驱动(i2c_driver)匹配后,调用驱动的probe函数初始化设备,注册字符设备提供接口给应用程序。
static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct at24_platform_data chip;
bool writable;
int use_smbus = 0;
struct at24_data *at24;
int err;
unsigned i, num_addresses;
kernel_ulong_t magic;

/*获取扳级设备信息*/
if (client->dev.platform_data) 
{
//如果在注册device资源的时候,mini2440_i2c_devs中存在
//i2c_register_board_info(0,mini2440_i2c_devs,ARRAY_SIZE(mini2440_i2c_devs));
//i2c_new_device中client->dev.platform_data = info->platform_data;
//i2c_register_board_info中devinfo->busnum = busnum;devinfo->board_info = *info;
//可以看出只要mini2440_i2c_devs中初始化了platform_data,就说明client->dev.platform_data存在.
//否则就判断id->driver_data,id表格中的数据,还不存在就出错退出。存在提取信息

chip = *(struct at24_platform_data *)client->dev.platform_data;
} else 
{
if (!id->driver_data) 
{
err = -ENODEV;
goto err_out;
}
magic = id->driver_data;
chip.byte_len = BIT(magic & AT24_BITMASK(AT24_SIZE_BYTELEN));//获取设备总的字节长度
magic >>= AT24_SIZE_BYTELEN;
chip.flags = magic & AT24_BITMASK(AT24_SIZE_FLAGS);//获取设备访问的方式
/*
* This is slow, but we can't know all eeproms, so we better
* play safe. Specifying custom eeprom-types via platform_data
* is recommended anyhow.
*/
chip.page_size = 1;//这种资源配置下,默认设备只分一个页


/* update chipdata if OF is present */

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值