사용자 지정 하드웨어 용 SPI 드라이버를 구현하려고합니다. 필자는 필요한 거의 모든 것을 지원하는 spidev 드라이버의 복사본을 가지고 시작했습니다.lseek 구현을위한 사용자 지정 SPI 드라이버
우리는 명령 비트 (읽기/쓰기)와 임의의 양의 데이터를 갖는 프로토콜을 사용합니다.
간단히 말해서 lseek 기능을 추가하는 것이 최선의 방법이라고 생각했습니다. 원하는 주소로 "Seek"한 다음 바이트 수를 읽거나 씁니다. 새 드라이버의 file_operations에서 custom .llseek를 만들었지 만 그 함수가 호출되는 것을 본 적이 없습니다. 나는 fseek(), lseek(), pread()를 사용해 보았고 그 함수들 중 어느 것도 새로운 my_lseek() 함수를 호출하지 않는 것으로 보인다. 내가 주로하기 때문에, dev에 파일이 만들어 얻을하는 방식에 뭔가가 없다고 생각
static struct spi_board_info my_spi_board_info[] __initdata = {
[0] = {
.modalias = "myspi",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 3000000,
.mode = SPI_MODE_0,
.controller_data = &spidev_mcspi_config,
}, ...
:
장치가 board.c 파일에 정의를 "errno를 29 ESPIPE 불법 탐색"모든 통화 보고서 예 내가
static int myspi_llseek(struct file *filp, loff_t off, int whence)
{
...
newpos = filp->f_pos + off;
...
}
그래서 내 질문은
f_pos> filp- 참조를 발견 :이 드라이버 (약간 수정 spidev) (가) "추구"지원을하는 방법이 전화를? 이것이 errno 29를 반환하기 위해 어느 시점에 정의됩니까? 새 드라이버에서 시작하고 spi_board_info() 및 spi_register_board_info() 설정에 의존 할 수 없습니까?/drivers/spi 디렉토리 (spi-dw)에있는 하나의 드라이버 만 lseek를 참조하며 default_llseek 구현을 사용합니다. 우리가 모든 것을 해내 고 실행하기 위해 생각해 낸 몇 가지 "해킹"이 있지만, 올바른 방법을 얻는 법을 배우려는 사람이되는 경향이 있습니다.
모든 의견을 매우 높이 평가합니다. (PS, 커널 버전은 OMAP 안드로이드 시스템의 경우 3.4.48 임)
나는 어딘가에 * 초기 위치를'-1' 대신'0'으로 설정해야한다고 생각합니다.하지만이 작업을 한 적이 없습니다. – o11c
* "/ drivers/spi 디렉토리 (spi-dw)에있는 하나의 드라이버 만 lseek를 참조합니다 ..."* - 그건 완전히 관련이없는 사실입니다. 이 디렉토리 (spidev.c 제외)는 SPI 마스터 컨트롤러 용이며 SPI 슬레이브 디바이스 용입니다. SPI 슬레이브 장치 용 SPI 프로토콜 드라이버는 해당 하위 시스템 디렉터리에 저장됩니다. IOW는 그들의 (SPI) 인터페이스가 아닌 * 기능 *에 의해 제공됩니다. * "어느 시점에서 이것이 errno 29를 반환하도록 정의됩니까?"* - ESPIPE에 대한 grep을 시도 했습니까? 잊어 버리고 코드에 ** no_llseek() ** 호출이 여전히 있습니까? – sawdust
@sawdust 필자는 확실히 file_operations 구조체에서 "my_llseek()"함수를 구현했습니다. – ColoradoIcculus