sysfs를 통해 동적으로 I2C 장치를 추가하는 경우. I2C 장치와 함께 제공되는 GPIO 핀도 정의할 수 있습니까?

sysfs를 통해 동적으로 I2C 장치를 추가하는 경우. I2C 장치와 함께 제공되는 GPIO 핀도 정의할 수 있습니까?

내 Linux 장치에 연결하려는 두 개의 I2C 장치가 있습니다. 온도 센서 TMP117을 작성하여 /sys/bus/i2c/devices/i2c-x/new_device추가로 가속도계 ADXL343을 추가하고 싶습니다. 그런데 TMP117과 같은 방법을 사용하면 dmesg인터럽트의 GPIO를 찾을 수 없다는 오류가 발생합니다. 이는 내 애플리케이션에 인터럽트 신호가 필요한 GPIO 확장기에도 영향을 미칩니다.

추가 신호(예: 인터럽트)를 사용하여 I2C 장치를 동적으로 추가할 수 있습니까?

답변1

~에서https://www.kernel.org/doc/Documentation/i2c/instantiating-devices다음으로 할 수 있는 일은오직I²C 주소를 인수로 전달합니다. 그렇다면 커널은 인터럽트 라인이 어떤 GPIO 라인에 연결되어 있는지 어떻게 알 수 있습니까?

따라서 I²C 장치보다 더 많은 하드웨어를 포함하는 복잡한 드라이버는 이러한 방식으로 사용할 수 없습니다.

부팅 시 하드웨어의 위치를 ​​알고 있다면(또는 모르더라도 - 요즘에는 런타임에 장치 트리를 수정할 수 있음) "올바른" 방법은 아마도 장치 트리 항목(위 문서의 1b)을 작성하는 것입니다. . 이것이 옵션이 아닌 경우 커널 모듈을 작성해야 합니다.

하지만, 좋은 소식: ADI의 Michael Hennerich(좋은 사람, 만나면 커피 한 잔 사주세요)가 썼습니다.adxl34x운전사(업스트림 Linux에 포함됨) 이는 실제로 ADXL34x를 찾을 I²C 버스의 주소와 수신할 인터럽트 라인을 커널에 알려주는 것입니다(다시 장치 트리를 통해).

답변2

읽으면서,Linux는 I2C 장치를 인스턴스화하는 4가지 방법을 제공합니다..

sysfs 인터페이스는 2개의 속성 파일( new_devicedelete_device)만 제공하고 new_device2개의 매개변수(I2C 장치 이름과 I2C 장치 주소)만 허용하므로 사용자 모드에서 IRQ를 조작할 수 없습니다.

그러나 이후 i2c_board_info 구조일부 IRQ 설정을 제공하십시오. 다음에 설명된 대로 버스 번호로 I2C 장치를 선언하는 것이 좋습니다.방법 1a(첫 번째 링크 참조) 주어진 예와 같이 구조를 정확하게 정의할 수 있습니다.

static struct i2c_board_info h4_i2c_board_info[] __initdata = {
    {
        I2C_BOARD_INFO("isp1301_omap", 0x2d),
        .irq        = OMAP_GPIO_IRQ(125),
    },
...
};

관련 정보