책에 설명된 대로 하드웨어 인터럽트를 트리거하고 싶습니다.리눅스 장치 드라이버핀 9와 10 사이에 와이어를 연결합니다. 시도했지만 분명히 인터럽트가 트리거되지 않았습니다.
cat /proc/interrupts
:
7: 0 XT-PIC parport0
이제 왜 그런지 알고 싶습니다. 커널 모듈을 로드합니다:
parport_pc 26004 0
parport 35239 2 ppdev,parport_pc
책에서는 인터럽트를 활성화해야 한다고 나와 있지만, 모듈을 로드할 때 그런 일이 발생합니다. 그렇죠?
내가 무엇을 할 수 있는지 어떤 아이디어가 있습니까?
답변1
단순히 핀을 연결하는 것만으로는 인터럽트가 발생하지 않습니다. 인용한 문서에 따르면 인터럽트를 생성하려면 핀 10으로 단락된 핀 9에 일부 데이터를 써야 합니다. 참조한 문서를 인용하려면 다음을 수행하십시오.
핀 9는 병렬 데이터 바이트의 최상위 비트입니다. 바이너리 데이터가 /dev/short0에 기록되면 여러 인터럽트가 생성됩니다. 그러나 ASCII 문자 세트에는 가장 높은 비트 세트가 있는 항목이 없기 때문에 ASCII 텍스트를 포트에 쓰면 중단이 발생하지 않습니다.
답변2
사람들은 왜 커널 코드를 읽는 것을 그토록 어렵게 생각합니까? :피.
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/char/ppdev.c
진지하게, 장치는 일반적으로 필요할 때, 즉 사용자 공간이 장치를 열 때만 활성화됩니다. 예:
ppdev.c를 보면 parport가 "선언"된 API를 제공한다는 것을 알 수 있습니다(반드시 고유하지는 않지만?!). 그래야만 호출됩니다 pp_enable_irq()
. (저는 open()을 먼저 보고 거기에 있는 주석을 보았습니다).
이것이 정확한 이유인지는 모르겠지만 가정에 결함이 있음을 보여줍니다. :).