I2C设备驱动

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• }
• static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) • { • int ret = 0;int retry=0; • char test_data = 1; • const char irq_table[2] = {IRQ_TYPE_EDGE_FALLING,IRQ_TYPE _EDGE_RISING}; • struct goodix_ts_data *ts; • struct goodix_i2c_rmi_platform_data *pdata;
I2C子系统
• 1. I2C核心、I2C适配器驱动和I2C设备驱 动的关系
• 2. 编写I2C设备驱动的方法
第一部分-- I2C体系结构
(1)I2C适配器驱动
• 一个i2c适配器驱动通常需要两个模块来描 述,一个是i2c_adapter和一个 i2c_algorithm • 内部主要是通过i2c_algorithm结构体包含 master_xfer函数的操作来完成数据传输的 • I2c_msg
• • • • • • • • • • • • •
static struct i2c_driver AK4187_driver = { .probe = goodix_ts_probe, .remove = goodix_ts_remove, #ifndef CONFIG_HAS_EARLYSUSPEND .suspend = goodix_ts_suspend, .resume = goodix_ts_resume, #endif .id_table = goodix_ts_id, .driver = { .name = GOODIX_I2C_NAME, .owner = THIS_MODULE, }, };
I2C驱动框架—suspend
• • • • • • • • • • • • • • • • • static int ak4187_suspend(struct i2c_client *client, pm_message_t mesg) { struct ak4187 *ts = i2c_get_clientdata(client); int err=0; ts->is_suspended = 1; disable_irq(client->irq); cancel_work_sync(&ts->work); err = i2c_smbus_write_byte_data(ts->client, AK4187_SETUP_ADDRESS, AK4187_SETUP_SLEEP0); if (err) { dev_err(&client->dev, "Suspend error = %d \n", err); } if (ts->power) { err = ts->power(0); if (err < 0) printk(KERN_ERR "ak4187_resume power off failed\n"); } return 0;
I2C适配器作用
• I2C适配器驱动—设备在总线上能够正常通 信,实现设备的数据传输
(2)I2C核心
• I2C核心主要是提供了API用于供I2C设备驱 动来调用以实现和总线的通信(从而进一 步实现和设备和CPU之间通信)。
I2C核心
I2C核心作用
• I2C核心—是一条纽带,将I2C设备适配器 和设备驱动连接起来。 它以通用的、与平 台无关的的接口实现了I2C中设备与适配器 的沟通
ห้องสมุดไป่ตู้
编写I2C设备驱动方法
• 理解数据手册和原理图 • 了解I2C的整体架构、寄存器说明和PIN引 脚说明等具体介绍 • 编写I2C设备驱动程序
I2C设备原理图
i2c设备驱动
• i2c设备驱动主要包含i2c_driver 和 i2c_client,内部成员函数要根据具体设备 实现不同的函数。 • i2c_client代表设备,一般我们将i2c_client 包含在自己定义的设备结构里 • 将i2c_driver结构里的函数进行初始化
• • }
}
• static int ak4187_remove(struct i2c_client *client) • { • struct ak4187 *ts = i2c_get_clientdata(client); • struct ak4187_platform_data *pdata; • • pdata = client->dev.platform_data; device_remove_file(&ts->input->dev, &dev_attr_cali_data); • free_irq(ts->irq, ts); • • del_timer_sync(&ts->ts_timer); • input_unregister_device(ts->input); • kfree(ts); • return 0; • }
I2C驱动框架—suspend
• • • • • • • • • • • • • • • • • • • • static int ak4187_resume(struct i2c_client *client) { struct ak4187 *ts = i2c_get_clientdata(client); int err; if (ts->power) { err = ts->power(1); if (err < 0) printk(KERN_ERR "ak4187_resume power on failed\n"); } err = ak4187_device_init(ts); if (err) { dev_err(&client->dev, "Initialize error = %d \n", err); return err; } ts->is_suspended = 0; enable_irq(client->irq); dev_info(&client->dev, "ak4187_resume\n"); return 0; }
I2C驱动框架—探测及初始化
• • • • • • •
ts = kzalloc(sizeof(*ts), GFP_KERNEL); if (ts == NULL) { ret = -ENOMEM; goto err_alloc_data_failed; ……. Request_irq(); Init_timer();
总结
I2C适配器、设备、核心 • I2C适配器驱动—设备在总线上能够正常通信,实 现设备的数据传输 • I2C设备驱动—实现对应设备的驱动,提供用户程 序接口 • I2C核心—是一条纽带,将设备适配器和设备驱动 连接起来。 它以通用的、与平台无关的的接口实 现了I2C中设备驱动与适配器的沟通
I2C适配器驱动
适配器驱动主要完成: 1)适配器i2c_adapter的初始化(时钟初始化、 申请I2C的I/O地址和中断号) 2)驱动适配器从硬件上产生各种信号和处理 I2C中断
部分适配器代码
static int tcc_i2c_doxfer(struct tcc_i2c *i2c, struct i2c_msg *msgs, int num) • { • int ret, i; • for (i = 0; i < num; i++) { • spin_lock_irq(&i2c->lock); • i2c->msg = &msgs[i]; • i2c->msg->flags = msgs[i].flags; • i2c->msg_num = num; • i2c->msg_ptr = 0; • i2c->msg_idx = 0; • i2c->state = STATE_START; • spin_unlock_irq(&i2c->lock); • • • • • • • • • • • • if (i2c->msg->flags & I2C_M_RD) { ret = recv_i2c(i2c); if (ret != 1) printk("recv_i2c failed! - addr(0x%02X)\n", i2c->msg->addr); } else { ret = send_i2c(i2c); if (ret != 1) printk("send_i2c failed! - addr(0x%02X)\n", i2c->msg->addr); } } return ret; }
I2C驱动框架—模块初始化
• static int __init ak4187_init(void) • { • ak4187_wq = create_singlethread_workqueue("ak4187_wq"); if (!ak4187_wq) • return -ENOMEM; • • return i2c_add_driver(&ak4187_driver); • } • static void __exit ak4187_exit(void) • { i2c_del_driver(&ak4187_driver); • if (ak4187_wq) • destroy_workqueue(ak4187_wq);
(3)I2C设备驱动
• I2C设备驱动—实现对应设备的驱动,完成设 备的特定动作,也提供用户程序接口 • 另外,I2c-dev.c针对适配器生成一个主设 备号位89的设备文件,实现设备驱动的文 件操作接口,针对字符设备使用。
I2C设备驱动
第二部分--编写I2C设备驱动
• i2c设备驱动一般在./kernel/driver/chips/文 件夹下,(因为大多设备也属于输入设备, 有的会放在输入设备下,如触摸屏驱动 在.kernel/driver/input/touchscreen/下)。 • 设备驱动是对设备端的实现,设备要挂载 到对应总线上才能和CPU通信.
• struct ak4187 { • struct input_dev *input; • struct hrtimer timer; • struct timer_list ts_timer; • struct work_struct work; • struct ts_event tc; • u8 intervalData[AK4187_INTDATA_NUM]; • • • • • • • • • • struct i2c_client *client; struct early_suspend early_suspend; spinlock_t lock; int irq; int is_suspended; int AK4187_First_Pendown; //Junger@0803 void (*clear_penirq)(void); int (*power)(int on); }; static struct ak4187 *gl_ts;
相关文档
最新文档