내 Linux 시스템에 로드되어 작동하는 /dev/i2c-1 마스터 드라이버를 사용하여 i2c 슬레이브 장치와 통신하고 있습니다. 슬레이브 장치에는 동시 쓰기 및 읽기를 위해 여러 주소 오프셋이 필요합니다.
이러한 작업을 수행하려면 i2c_transfer() 및 i2c_msg 배열을 사용해야 한다고 확신합니다. 저는 이전에 커널 공간에서 코딩한 적이 없으며, 커널 공간을 얻는 방법에 대한 지침이 필요합니다."드라이버 인스턴스의 장치 구조에 대한 포인터"i2c 마스터 드라이버가 내 시스템에 로드되어 사용자 공간에서 i2c_transfer() 함수를 호출할 수 있습니다. 다음은 i2c_transfer() 사용 방법에 대해 온라인에서 찾은 몇 가지 팁에 대한 링크입니다. https://docs.zephyrproject.org/apidoc/latest/group__i2c__interface_ga540f88fd7f8f85eaad7872fe24a00267.html
i2c_master 드라이버는 내 시스템의 버스 1에 등록되어 있습니다. 슬레이브 주소는 0x6c이며 명령줄에서 i2c_set 및 i2c_get 명령을 사용하여 수동으로 읽고 쓸 수 있습니다.
이 c 함수를 참조할 수 있도록 시스템에 현재 등록된 장치/드라이버 구조에 대한 포인터를 어떻게 찾을 수 있습니까?
답변1
한 가지 방법은 i2c 장치 드라이버 내부에 구조체 포인터를 생성하고(등록된 장치 유형을 가리키며 - struct i2c_client*인 것 같습니다) 드라이버가 로드될 때(프로브 기능에서) 장치 포인터를 사용하여 로드하는 것입니다.
그런 다음 로드 가능한 커널 모듈에서 액세스할 수 있는 구조 포인터를 내보내야 합니다. 특정 방법과 기능을 사용하여 장치에 쓰기(i2c.h에서 찾아야 함)
그러나 이 방법은 그다지 좋지 않습니다. 왜냐하면 이 포인터를 잘못 처리하면 커널 패닉이 발생할 수 있기 때문입니다.