linux dts i2c

本文介绍了在Linux环境下为lis3dh加速度计配置设备树(dts)及相应驱动的方法。通过设备树文件imx6sl-evk.dts添加lis3dh设备节点,并在内核源码中实现lis3dh平台数据结构和设备ID匹配表。最终实现了lis3dh加速度计的正确加载和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.voidcn.com/blog/sevenjoin/article/p-4954234.html

http://blog.youkuaiyun.com/u013129593/article/details/53010773

http://www.cnblogs.com/lihaiyan/p/4475194.html

http://www.voidcn.com/blog/xishuang_gongzi/article/p-6240391.html


1. dts configuration

kernel_imx/arch/arm/boot/dts/imx6sl-evk.dts

&i2c2{
...
       /*luke add for lis3dh st*/
        lis3dh@18 {
                compatible = "st,lis3dh";
                reg = <0x18>;
                status = "okay";
        };  
      /*ed*/
};

2. c source

CONFIG_OF is the adding for dts

#ifdef CONFIG_OF
static struct lis3dh_acc_platform_data lis3dh_pdata = {
.poll_interval = 10,
.min_interval  = 10,
.axis_map_x    = 0,
.axis_map_y    = 1,
.axis_map_z    = 2,
.negate_x      = 1,
.negate_y      = 0,
.negate_z      = 1,
.gpio_int1     = -EINVAL,
.gpio_int2     = -EINVAL,
};

static const struct of_device_id lis3dh_i2c_dt_ids[] = {
	{
	  .compatible = "st,lis3dh",
  }
}

MODULE_DEVICE_TABLE(of,lis3dh_i2c_dt_ids);
#endif

static int lis3dh_acc_probe(struct i2c_client *client,
		const struct i2c_device_id *id)
{


  #ifdef CONFIG_OF
  client->dev.platform_data = &lis3dh_pdata;	
  #endif

...
	return 0;

}


static struct i2c_driver lis3dh_acc_driver = {
	.driver = {
			.owner = THIS_MODULE,
			.name = LIS3DH_ACC_DEV_NAME,
			#ifdef CONFIG_OF
			.of_match_table = of_match_ptr(lis3dh_i2c_dt_ids),
			#endif
		  },
	.probe = lis3dh_acc_probe,
	.remove = lis3dh_acc_remove, 
	.id_table = lis3dh_acc_id,
};

static int __init lis3dh_acc_init(void)
{
	return i2c_add_driver(&lis3dh_acc_driver);
}

static void __exit lis3dh_acc_exit(void)
{
	i2c_del_driver(&lis3dh_acc_driver);
}

module_init(lis3dh_acc_init);
module_exit(lis3dh_acc_exit);

MODULE_DESCRIPTION("lis3dh accelerometer sysfs driver");
MODULE_AUTHOR("Matteo Dameno, Carmine Iascone, STMicroelectronics");
MODULE_LICENSE("GPL");

3. result


btw: i2c_tools is the useful tools for i2c debug


根据提供的引用内容,可以了解到在Linux驱动程序中,需要读取Linux内核中附带的dts文件,并操作设备树DTS的相关节点。同时,还提到了在MTK平台上分析Linuxi2c框架。 对于Linuxi2c设备树(DTS)操作,可以按照以下步骤进行: 1. 首先,需要在设备树中定义i2c控制器和i2c设备节点。在设备树中,使用`i2c`关键字来定义i2c控制器,使用`i2c_device`关键字来定义i2c设备。例如: ```dts i2c { compatible = "i2c"; #address-cells = <1>; #size-cells = <0>; i2c@0 { compatible = "i2c-device"; reg = <0>; // 其他属性 }; }; ``` 2. 在驱动程序中,可以使用`of_find_node_by_name()`函数来查找设备树中的节点。该函数接受一个参数,即节点名称,返回一个指向节点的指针。例如: ```c struct device_node *node; node = of_find_node_by_name(NULL, "i2c"); if (node) { // 找到了i2c节点 // 进行其他操作 } ``` 3. 通过节点指针,可以使用`of_property_read_u32()`函数来读取节点的属性值。该函数接受三个参数,分别是节点指针、属性名称和一个指向变量的指针,用于存储属性值。例如: ```c u32 value; if (of_property_read_u32(node, "reg", &value) == 0) { // 读取成功,可以使用value进行其他操作 } ``` 4. 可以使用`of_get_child_by_name()`函数来获取节点的子节点。该函数接受两个参数,分别是父节点指针和子节点名称,返回一个指向子节点的指针。例如: ```c struct device_node *child; child = of_get_child_by_name(node, "i2c@0"); if (child) { // 找到了子节点 // 进行其他操作 } ``` 5. 最后,记得在驱动程序中使用`of_node_put()`函数来释放节点指针。例如: ```c of_node_put(node); ``` 这样,就可以在Linux驱动程序中进行设备树节点的操作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值