I2C 장치 드라이버 바인딩

I2C 장치 드라이버 바인딩

TCA8418 키보드(I2C에서 실행)를 사용하려고 하는데 드라이버를 커널에 로드했지만 장치가 인식되지 않아 직접 인스턴스화하고 드라이버를 바인딩할 수 없습니다. 다음 오류가 발생합니다.

# 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);
    ...
}

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

관련 정보