mma7660(gsensor)的hwmon驱动

本文详细介绍了Linux内核中mma7660 gsensor驱动的设计与实现,包括驱动设计要求、I2C总线配置、硬件连接和驱动流程。内容涵盖gsensor如何通过I2C与输入子系统交互,创建工作队列读取传感器数据,并通过sysfs接口注册到Input子系统,以及驱动调试方法。
摘要由CSDN通过智能技术生成

gsensor驱动在系统中的层次如下图所示:

[转载]linux <wbr>Gsensor驱动(bma250为例子)

图中包含三个部分:hardware, driver, input

n         Hardware:其实我们可以认为Gsensor也是一个I2C设备。整个Gsensor芯片分为两部分,一个是sensor传感器,另一个是controller控制器,用于将sensor挂载在linux系统的I2C上。驱动程序则通过I2CGsensor做通信。

n         Gsensor Driver:是驻留于操作系统中,为gsensor hardware服务的一个内核模块;它将gsensor hardware采集到的原始数据,进行降噪,滤波,获得当前平板的空间状态,并按照操作系统的要求,将这些信息通过input core上报给操作系统。

n         Input core: linux为简化设备驱动程序开发,而开发的一个内核子系统;发给input core的数据将提供给操作系统使用。

实际使用时,驱动按照一定的时间间隔,通过数据总线,获取gsensor hardware采集到的数据,并按照操作系统的要求,将这些信息通过input core上报给操作系统。

2 Gsensor驱动设计要求

gsensor驱动在系统中的层次,上有Input core,下有I2C,驱动需要通过I2C采集信息,并准确及时的上报数据至input core。驱动上报的数据,是被input core管理并被上层使用的,应符合input core和上层应用框架的要求;

2.1符合Input输入子系统的设计规范

接口:Gsensor驱动,在设计上,不应自行决定是否上报,上报频率等,应提供接口,供上层应用控制驱动的运行和数据上报:包括使能控制Enable 上报时延delay等;通常通过sysfs文件系统提供,这部分实现,遵循标准的linux规范;

上报数据的方式:或者提供接口供上层访问(eg: ioctl),或者挂接在系统子系统上,使用系统子系统的接口,供上层使用(eg: input core)

读取数据的支持:应满足读取数据的要求,进行相应的配置;i2c总线为例,简要说明在tiny4412平台上,配置总线传输相关信息;

2.2 I2c总线的配置

要使用i2c总线进行数据传输,需注册i2c driver,创建i2c-client,以便使用i2c-adapter进行数据传输;

要成功注册i2c driver有两种方式:

n         使用i2c_register_board_info:此方式,需要在系统启动时,进行相关信息的注册,不利于模块化开发,现已不推荐;目前,在2.6内核上,还支持此方式,在3.0上已不再支持;

n         使用detect方式:在模块加载时,进行检测,在条件成立时,注册i2c设备相关信息,创建i2c-client,并注册i2c driver,执行probe操作;

 

需要说明的是,此两种方式可共存,目前2.6就是这样的;在共存时,以i2c_register_board_info信息为更高优先级,在i2c_register_board_info已经占用设备的前提下,内核发现设备被占用,不会执行detect, 因而不会有冲突。

3 gsensor模块硬件说明

n         gsensor硬件,负责获取gsensor传感器所处的空间状态信息,存放于fifo中,供主控使用,不同的硬件平台,数据准备好后,告知主控的方式及主控获取数据的方式略有不同。

n         告知主控的方式:gsensor作为传感器,本身无法区分哪些数据是应该上报的,哪些数据是无效的,它只能接受主控的控制,以主控主动查询为主;

n         主控获取数据的方式:通过ahb, i2c, spi,usb等方式获取都是可能的。以下以一种典型的硬件连接为例,描述gsensor 传感器,gsensor ic, 主控之间的连接关系;

3.1 gsensor硬件连接

[转载]linux <wbr>Gsensor驱动(bma250为例子)

Gsensor在硬件上,只有i2c连接,这些连接信息,需要事先告知驱动,从而从指定的设备上读取数据;这些连接信息,通过sysconfig1描述,在驱动中使用;

4.2:mma7660平台资源数据(gsensor的配置):

static struct mma7660_platform_data mma7660_pdata = {
.irq = IRQ_EINT(25),
.poll_interval= 100,   // * @poll_interval: specifies how often the poll() method should be called.
  //*Defaults to 500 msec unless overridden when registering the device.

.input_fuzz= 4,
.input_flat = 4,
};

static struct i2c_board_info smdk4x12_i2c_devs3[] __initdata = {
#ifdef CONFIG_SENSORS_MMA7660
{
I2C_BOARD_INFO("mma7660", 0x4c),  //0x4c is in datasheet. is slave address
.platform_data = &mma7660_pdata,
},
#endif
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值