I2C 장치 드라이버 바인딩

I2C 장치 드라이버 바인딩

I2C를 통해 작동하는 TCA8418 키패드를 사용하려고 하는데 드라이버가 커널에 로드되어 있지만 장치가 인식되지 않아 직접 인스턴스화하고 드라이버를 바인딩할 수 없습니다. 다음 오류가 발생합니다.

# echo -n "1-0034" > /sys/bus/i2c/drivers/tca8418_keypad/bind
-bash: echo: write error: No such device

이것은 (루트로서) 다음을 시도한 후입니다.

# echo -n "tca8418_keypad" 0x34 > /sys/bus/i2c/devices/i2c-1/new_device

각각 다음과 같은 장치 및 드라이버 트리가 있습니다.

/sys/bus/i2c/devices/1-0034
|-- modalias
|-- name
|-- power
|   |-- autosuspend_delay_ms
|   |-- control
|   |-- runtime_active_time
|   |-- runtime_status
|   `-- runtime_suspended_time
|-- subsystem -> ../../../../../bus/i2c
`-- uevent

/sys/bus/i2c/drivers/tca8418_keypad
|-- bind
|-- module -> ../../../../module/tca8418_keypad
|-- uevent
`-- unbind

지금까지 참조를 위해 다음을 사용했지만 둘 다 완전히 작동하지 않는 것 같습니다.

아이디어가 부족하여 몇 가지 제안을 사용할 수 있습니다. 내가 이것에 접근하고 있습니까?오른쪽방법?

중요한 경우에는 ARM 단일 보드 컴퓨터에서 데비안을 실행하고 있습니다.

편집하다:

이후 새 장치를 인스턴스화할 때 다음 오류가 발생한다는 것을 발견했습니다.

tca8418_keypad: probe of 1-0034 failed with error -22

답변1

이 장치에 대한 플랫폼 데이터가 누락되었습니다.

플랫폼 데이터를 드라이버 모듈의 코드에 직접 삽입하여 작동시킬 수 있었습니다.

static uint32_t tca8418_km_data[] = {
    KEY(0, 0, KEY_F1),
    KEY(0, 1, KEY_F2),
    KEY(0, 2, KEY_F3),
    ...
};

static const struct matrix_keymap_data tca8418_mk_data = {
    .keymap         = tca8418_km_data,
    .keymap_size    = ARRAY_SIZE(tca8418_km_data),
};

static struct tca8418_keypad_platform_data my_tca8418_plat_data = {
    .keymap_data    = &tca8418_mk_data,
    .rows           = 6,
    .cols           = 8,
    .rep            = 1,
    .irq_is_gpio    = 1,
};

static struct i2c_board_info tca8418_board_info __initdata = {
    I2C_BOARD_INFO("tca8418_keypad", 0x34),
    .platform_data  = &my_tca8418_plat_data,
    .irq            = 16, // GPIO pin 16
};

그런 다음 이것을 __init 함수에 추가합니다.

static int __init tca8418_keypad_init(void)
{
    struct i2c_adapter *i2c_adap;
    i2c_adap = i2c_get_adapter(1);
    i2c_new_device(i2c_adap, &tca8418_board_info);
    ...
}

이것은 가장 우아한 수정 사항은 아니지만 나에게는 효과가 있었습니다. 나는 사용자 공간 솔루션을 선호했지만 찾을 수 없었습니다.

관련 정보