BMA150 博世 三轴加速度传感器
SPI(4线,3线),i2c,中断引脚
频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值
低功耗,快速唤醒
包含数据寄存器,控制寄存器,状态寄存器,设置寄存器及EEPROM
寄存器读写使用i2c接口,所以需要驱动i2c设备
数据需要获取xyz值,所以可以添加成input设备
用一个bma150_data数据对象来描述整个设备
struct bma150_data {
struct i2c_client *client; //i2c 客户端
struct input_polled_dev *input_polled; //轮询输入设备
struct input_dev *input; //输入设备
u8 mode; //记录状态模式
};
如果bma150有中断响应则用输入设备,数据在中断处理完上报
没有则使用轮询输入设备,不断访问数据
bma150的配置信息用一个结构体bma150_cfg去表述
struct bma150_cfg { //bma150配置
bool any_motion_int; /*any-motion 中断*/
bool hg_int; /*high-G 中断 */
bool lg_int; /*low-G 中断 */
unsigned char any_motion_dur; /* Any-motion 持续时间 */
unsigned char any_motion_thres; /* Any-motion 阀值 */
unsigned char hg_hyst; /* High-G 延迟 */
unsigned char hg_dur; /* High-G 持续时间 */
unsigned char hg_thres; /* High-G 阀值 */
unsigned char lg_hyst; /* Low-G 延迟 */
unsigned char lg_dur; /* Low-G 持续时间 */
unsigned char lg_thres; /* Low-G 阀值 */
unsigned char range; /* 频响 */
unsigned char bandwidth; /* 带宽 */
};
三个中断使能值及其中断属性,频响,带宽
驱动i2c设备需要i2c设备驱动及i2c设备
所以板级驱动用I2C_BOARD_INFO("bma150", (0x38))注册i2c设备
内核中bma150.c文件包含bma150芯片的i2c设备驱动
module_i2c_driver(bma150_driver);//声明模块入口出口
加载模块的时候注册bma150对应的i2c设备驱动bma150_driver
static struct i2c_driver bma150_driver = { //i2c设备驱动
.driver = {
.owner = THIS_MODULE,
.name = BMA150_DRIVER, //"bma150"
.pm = &bma150_pm,
},
.class = I2C_CLASS_HWMON,
.id_table = bma150_id, //匹配id表(兼容smb380,bma023)
.probe = bma150_probe, //probe方法
.remove = bma150_remove, //remove方法
};
i2c设备与驱动匹配后会调用驱动的probe方法bma150_probe
static int bma150_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
const struct bma150_platform_data *pdata = client->