linux驱动开发扩展--i2c触摸屏驱动分析

本文深入剖析Linux驱动开发中i2c触摸屏驱动的细节,涉及i2c_add_driver函数注册驱动、i2c_client结构、i2c_register_board_info以及设备初始化、中断处理等关键步骤,阐述了驱动与设备匹配、中断处理程序的注册以及输入事件设置的过程。
摘要由CSDN通过智能技术生成

drivers/input/touchscreen/gslx680.c(该文件需要自己添加)

static int __init gsl_ts_init(void)
{
    int ret;
	print_info("==gsl_ts_init==\n");
	ret = i2c_add_driver(&gsl_ts_driver);
	print_info("ret=%d\n",ret);
	return ret;
}
static void __exit gsl_ts_exit(void)
{
	print_info("==gsl_ts_exit==\n");
	i2c_del_driver(&gsl_ts_driver);
	return;
}

module_init(gsl_ts_init);
module_exit(gsl_ts_exit);

 gsl_ts_init函数中调用了i2c子系统核心部分提供的i2c_add_driver函数注册了i2c触摸屏驱动。

i2c_driver

static struct i2c_driver gsl_ts_driver = {
	.driver = {
		.name = GSLX680_I2C_NAME,
		.owner = THIS_MODULE,
	},
#ifndef CONFIG_HAS_EARLYSUSPEND
	.suspend	= gsl_ts_suspend,
	.resume	= gsl_ts_resume,
#endif
	.probe		= gsl_ts_probe,
	.remove		= __devexit_p(gsl_ts_remove),
	.id_table	= gsl_ts_id,
};
static const struct i2c_device_id gsl_ts_id[] = {
	{GSLX680_I2C_NAME, 0},
	{}
};
struct i2c_device_id {
	char name[I2C_NAME_SIZE];
	kernel_ulong_t driver_data	/* Data private to the driver */
			__attribute__((aligned(sizeof(kernel_ulong_t))));
};

gsl_ts_id中的name会被用来进行和client的匹配(可通过分析i2c bus的match函数得到),driver_data是一个索引值用来记录当前这个i2c_device_id项在id_table中的索引

 i2c_client

smdkc110_machine_init
    i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
    i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
    i2c_register_board_info(2, i2c_devs2, ARRAY_SIZE(i2c_devs2));

/* I2C0 */
static struct i2c_board_info i2c_devs0[] __initdata = {
#ifdef CONFIG_SND_SOC_WM8580
	{
		I2C_BOARD_INFO("wm8580", 0x1b),
	},
#endif
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值