ST 提供兩種 driver type:
iio 好像是新的..這裡只看 input (其實是因為只有 port input)
input device return 都是一個 input_event 的 structure:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
type 就定義在 linux/input.h
所以 driver 只能借用用input.h 的值:
#define INPUT_EVENT_TYPE EV_MSC
#define INPUT_EVENT_X MSC_SERIAL
#define INPUT_EVENT_Y MSC_PULSELED
#define INPUT_EVENT_Z MSC_GESTURE
#define INPUT_EVENT_TIME_MSB MSC_SCAN
#define INPUT_EVENT_TIME_LSB MSC_MAX
g sensor 中,report data 的 function:
static void lis2dw12_report_3axes_event(struct lis2dw12_sensor_data *sdata,
s32 *xyz, s64 timestamp)
{
struct input_dev *input = sdata->input_dev;
if (!sdata->enabled)
return;
input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_X, xyz[0]);
input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_Y, xyz[1]);
input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_Z, xyz[2]);
input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_TIME_MSB,
timestamp >> 32);
input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_TIME_LSB,
timestamp & 0xffffffff);
input_sync(input);
}
所以 read( ) 讀進來的...就是...
ev.type = INPUT_EVENT_TYPE
ev.code = INPUT_EVENT_X
ev.value = x acceleration value
所以參考前面的
reading input device 的程式,修改一下..
const char *dev="/dev/input/event0";
..
..
if(ev.type == INPUT_EVENT_TYPE) {
switch(ev.code) {
case INPUT_EVENT_X:
printf("X: %d\n",ev.value);
break;
case INPUT_EVENT_Y:
printf("Y: %d\n",ev.value);
break;
case INPUT_EVENT_Z:
printf("Z: %d\n",ev.value);
break;
default:
printf("NOT VALID code: %d\n",ev.code);
}
}else{
printf("NOT VALID TYPE: %d\n",ev.type);
}
driver 的控制界面在sysfs 裡...enale it..
# ls /sys/class/input/event0/device/accel
enable polling_rate resolution scale scale_avail
# echo 1 > /sys/class/input/event0/device/accel/enable
執行..
# ./gmonitor
X: -25376
Y: -14640
Z: 973072
NOT VALID code: 4
NOT VALID code: 7
NOT VALID TYPE: 0
X: -22448
Y: -18544
Z: 967216
NOT VALID code: 4
NOT VALID code: 7
NOT VALID TYPE: 0
X: -26352
Y: -17568
Z: 968192
NOT VALID code: 4
NOT VALID code: 7
NOT VALID TYPE: 0
查一下 code 4,7 和 type 0..
uapi/linux/input-event-code.h:
/*
* Event types
*/
#define EV_SYN 0x00
...
/*
* Misc events
*/
#define MSC_SERIAL 0x00
#define MSC_PULSELED 0x01
#define MSC_GESTURE 0x02
#define MSC_RAW 0x03
#define MSC_SCAN 0x04
#define MSC_TIMESTAMP 0x05
#define MSC_MAX 0x07
#define MSC_CNT (MSC_MAX+1)
所以 type 是 EV_SYN,
code 是 INPUT_EVENT_TIME_MSB/LSB
type 是 __s64
對照上面的 driver function : lis2dw12_report_3axes_event
* fixed --
gsensormonitor