接续上一节,本文主要介绍驱动部分的客制化
1, hardware层
通过系统调用open,read,write对sys/class/sensor/m_acc_misc读写操作
路径:vendor/mediatek/proprietary/hardware/sensor/sensors-1.0/Acceleration.cpp
直接操作/sys/class/sensor/m_acc_misc节点,发命令。
2,kernel 层Sensor Driver 的客制化
2.1 驱动参数配置
Accelerometer 参数配置:
注意传感器的方向
2.2 创建传感器节点属性(所以传感器都需要通过次方法创建sys节点)
路径:drivers/misc/mediatek/sensors-1.0/hwmon/sensor_attributes/sensor_attr.c
static int __init sensor_attr_init(void)
sensor_attr_class = class_create(THIS_MODULE, “sensor”); //sys/class/sensor
sensor_attr_major = register_chrdev(0, “sensor”, &sensor_attr_fops);//注册sensor主设备号
int sensor_attr_register(struct sensor_attr_t *misc)
dev = MKDEV(sensor_attr_major, misc->minor);//对于每个sensor生成主次设备号
misc->this_device = device_create(sensor_attr_class, misc->parent, dev,misc, “%s”, misc->name); //创建节点/dev/m_acc_misc
err = sensor_event_register(misc->minor);//向hwmon注册设备
obj->client[handle].head = 0;
obj->client[handle].tail = 0;
obj->client[handle].bufsize = CONTINUE_SENSOR_BUF_SIZE;
缓存各种传感器上报的数据存入buffer(所有传感器的数据都会通过一个buffer数组存储起来)
路径:drivers/misc/mediatek/sensors-1.0/hwmon/sensor_event/sensor_event.c
int sensor_input_event(unsigned char handle, const struct sensor_event *event)
client->buffer[client->head++] = *event; //将event存储用数组实现的队列中
client->head &= client->bufsize - 1;//0 1 2 3 … 2047 0 1 2 3… 2047 0 1 2 3…
unsigned int sensor_event_register(unsigned char handle)
obj->client[handle].head = 0;
obj->client[handle].tail = 0;
obj->client[handle].bufsize = BIO_SENSOR_BUF_SIZE;
obj->client[handle].buffull = false;
管理所有加速度传感器,并且注册的大量sys节点属性提供给上层访问,将所有加速度传感器接口通过节点属性给上层调用
路径:kernel-4.14/drivers/misc/mediatek/sensors-1.0/accelerometer/accel.c