tiny4412的I2C驱动实现案例(基于MMA7660)自己写的,亲测有效

本文介绍了如何在Linux内核中实现Tiny4412平台的I2C驱动,以MMA7660陀螺仪为例,详细阐述了配置I2C_client结构体、设置从机地址和名字、编译内核的过程,并提供了MMA7660的寄存器配置及驱动和测试程序代码。

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

1.配置I2C_client结构体的从机地址和名字
非设备树配置:
a.在arch/arm/mach-exynos/ 下打开mach-tiny4412.c
b.在其中仿照其他结构体添加设备名字与从机地址:如下图,代表我的设备名字是mma7660,从机地址为:0X4C。

static struct i2c_board_info smdk4x12_i2c_devs3[] __initdata = {
	{
		I2C_BOARD_INFO("mma7660", 0x4c),
	},
};

c.然后继续在这个mach-tiny4412.c文件下找到 smdk4x12_machine_init 这个函数,仿照原有的其他设备在其中添加:

i2c_register_board_info(2, smdk4x12_i2c_devs3,
			ARRAY_SIZE(smdk4x12_i2c_devs3)); 
//其中i2c_register_board_info这个函数为向I2c_adapter构建的I2C_client添加从机地址与名字,
名字用来和之后的I2C_driver中的做匹配,
第一个参数为上一步骤所填写的结构体数组名字,第二个参数为该对象的大小

d.编译内核:make zImage -j8

MMA7660所需寄存器以及配置
MMA7660的寄存器可以参考其数据手册,我是仿照开发板商在内核中提供的mma7660.c里面的寄存器配置实现的寄存器和功能配置如下:

#define MMA7660_XOUT 0x00 // 6位输出值X,从该寄存器中读取X值
#define MMA7660_YOUT 0x01 // 6位输出值Y, Y值
#define MMA7660_ZOUT 0x02 // 6位输出值Z,Z值
#define MMA7660_TILT 0x03 //倾斜状态
#define MMA7660_SRST 0x04 //采样率状态
#define MMA7660_SPCNT 0x05 //睡眠计数
#define MMA7660_INTSU 0x06 //中断设置
#define MMA7660_MODE 0x07 //模式
#define MMA7660_SR 0x08 //自动唤醒/睡眠并去除过滤器
#define MMA7660_PDET 0x09 // 清敲检测
#define MMA7660_PD 0x0a // 利用防反跳计数

一些配置的典型值:

struct register_info_data reg[7] = {
	{MMA7660_MODE, 0x00},
 	{MMA7660_SR, ((2<<5) | (1<<3) | 1)},
	{MMA7660_SPCNT, 0xA0}, 
	{MMA7660_PDET, 4}, 
	{MMA7660_PD, 15},
  	{MMA7660_INTSU, 0xe7}, 
  	{MMA7660_MODE, 0x59}
  };

按照上述寄存器配置可完成等待态的寄存器读取,可参考内核中的mma7660.c和mma7660.h文件查看具体信息。

代码如下:
mma7660驱动代码:mma7660_drv.c

#include <linux/module.h>
#include <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值