2020/8/4

MEMS motion sensor : IIS2DLPC. linux driver 和 使用

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

沒有留言:

張貼留言