1 소개
Linux는 강력하고 안정적인 커널, 쉬운 확장 및 축소, 풍부한 하드웨어 지원 등 많은 장점으로 인해 임베디드 시스템에 널리 사용되었습니다. 많은 임베디드 Linux 시스템, 특히 사용자와의 상호 작용이 강한 시스템에는 특수 키보드를 장착해야 하는 경우가 많습니다. 이때 개발자는 실제 조건에 따라 자신만의 특수 키보드용 드라이버를 작성해야 합니다.
2 Linux 키보드 드라이버 소개
Linux의 대부분의 드라이버는 계층적 아키텍처를 채택하며 키보드 드라이버도 예외는 아닙니다. Linux에서 키보드 드라이버는 두 개의 레이어로 구현됩니다. 그 중 상위 계층은 일반적인 키보드 추상화 계층으로, 기본 특정 하드웨어에 의존하지 않는 키보드 드라이버의 일부 기능을 완성하고 기본 계층에 서비스를 제공하는 역할을 담당합니다. 하위 계층은 하드웨어 처리 계층입니다. , 이는 특정 하드웨어와 밀접하게 관련되어 있으며 주로 하드웨어 처리를 담당합니다. 키보드 드라이버의 상위 공개 부분은 drivers/keyboard.c에 있습니다. 이 파일에서 가장 중요한 것은 EXPORT_SYMBOL 매크로를 사용하여 커널이 내보낸 handler_scancode 함수입니다. handler_scancode에 의해 완성된 기능은 다음과 같습니다. 먼저 스캔 코드를 키 코드로 변환한 다음 Shift, Alt 및 기타 확장 키(일반적으로 ASCII 코드)를 눌러 키 코드를 대상 코드로 변환하고 마지막으로 ASCII 코드를 입력합니다. 터미널 장치 버퍼에 넣고 태스크릿을 예약하여 모니터에 표시합니다. 이 함수는 키보드 드라이버의 핵심 작업 중 일부를 완료하고 이러한 핵심 논리 기능은 기본 하드웨어에 의존하지 않으므로 기본 하드웨어 처리 함수 호출로 격리하여 내보낼 수 있음을 알 수 있습니다. 키보드 드라이버의 상위 공개 부분에 의해 호출되고 기본 하드웨어 처리 기능에 의해 구현되는 몇 가지 다른 콜백 함수도 이 파일에 정의되어 있습니다. 예를 들어 kbd_init_hw, kbd_translate, kbd_unexpected_up 등이 있습니다. 그 중 kbd_translate는 스캔 코드를 키 코드로 변환하는 역할을 하는 handler_scancode에 의해 호출됩니다. 키보드 드라이버의 기본 하드웨어 처리 부분은 하드웨어에 따라 구현이 다릅니다. 예를 들어, PC 플랫폼의 표준 키보드의 기본 하드웨어 처리 기능은 드라이버/Pc_keyb.c에 집중되어 있습니다. 이 파일에는 키보드 인터럽트 처리 기능인keyboard_interrupt, 스캔 코드에서 키 코드로의 변환 기능인 pckbd_translate 및 기본 하드웨어와 밀접하게 관련된 기타 기능이 포함되어 있습니다.
이 아키텍처에서는 시스템에 특수 키보드를 추가하는 것이 특히 명확합니다. 개발자는 키보드를 구동하기 위해 드라이버에 기본 하드웨어 처리 기능만 작성하면 됩니다. 일반적으로 기본 하드웨어 처리 기능에서 가장 중요한 작업은 키보드 인터럽트 처리에서 누른 키의 스캔 코드를 가져오고 이를 매개변수로 사용하여 handler_scancode를 호출하는 것입니다. 스캔 코드는 직접 정의할 수 있지만 반드시 수행해야 합니다. 키보드에서 누른 키의 위치를 고유하게 식별합니다. 또한 개발자는 사용자 정의 스캔 코드에서 키 코드로 해당 변환 기능 kbd_translate도 제공해야 합니다. 특정 키 코드 변환, 터미널의 입력 버퍼에 대상 코드 배치 및 에코는 모두 handler_scancode에 의해 완료됩니다. 또한 여기서 커널 내보내기 함수인 handler_scancode가 전체 키보드 드라이버에서 상위 일반 추상화 계층과 기본 하드웨어 처리 계층을 연결하는 데 핵심 역할을 한다는 것을 알 수 있습니다.
3 응용 예
아래에서는 특정 응용 예를 사용하여 임베디드 Linux 시스템에서 특수 키보드용 드라이버를 작성하는 구체적인 프로세스를 설명합니다.
3.1 하드웨어 모듈 설명
이 시스템의 구성은 삼성의 S3C2410 개발 보드를 하드웨어 플랫폼으로 사용합니다. 특수 키보드의 하드웨어 모듈은 주로 2개의 SN74hc164 칩과 4행 16열의 매트릭스 스캐닝 회로로 구성됩니다. SN74hc164는 8비트 직렬 입력 및 병렬 출력 시프트 레지스터로, 직렬로 연결된 8개의 D 플립플롭으로 구성됩니다. 작동 원리는 다음과 같습니다. SN74hc164 칩은 클록 CLK 펄스의 상승 에지에서 8개의 클록 펄스 후에 A 및 B 핀의 직렬 입력을 출력 핀 QA ~ QH로 출력합니다. 진리표는 그림 1에 나와 있습니다.
두 개의 SN74hc164 칩을 직렬로 연결한 후 CLK 핀과 CLR 핀을 각각 S3C2410 개발 보드의 GPB2 및 GPB4 포트에 연결하고 첫 번째 SN74hc164 칩의 A 및 B 핀을 연결합니다. 개발 보드의 GPB1 포트에서는 이 3개의 GPIO 포트가 출력 포트로 구성됩니다. 이러한 방식으로 우리는 2개의 SN74hc164 레지스터를 사용하여 3개의 GPIO 포트만 점유하고 매트릭스 스캐닝 회로의 16개 열에 입력을 제공함으로써 비용을 절감하고 GPIO 리소스 낭비를 방지합니다. 그러나 이는 또한 키보드 드라이버 구현에 특정 문제를 가져옵니다. 드라이버는 먼저 SN74hc164를 구동해야 하며 그런 다음 매트릭스 회로의 16개 열을 제어할 수 있습니다. 매트릭스 회로의 4개의 행 핀은 각각 S3C2410의 GPG6, GPG7, GPG8, GPG9 포트에 연결되며, 이 4개의 포트는 인터럽트 소스로 구성됩니다. 키를 누르지 않으면 높은 전위로 직접 읽혀지며, 키보드의 16개 열은 먼저 SN74hc164 칩을 통해 낮은 전위로 설정됩니다. 아무 키나 누르면 해당 행 GPG 포트에 전압이 발생합니다. 높은 곳에서 낮은 곳으로 점프하면 인터럽트가 발생합니다.
3.2 소프트웨어 모듈 설명
위 내용은 임베디드 리눅스 시스템의 키보드 드라이버 구현 내용입니다. (1) 더 많은 관련 내용은 PHP 중국어 홈페이지(www.kr)를 참고해주세요. .php.cn)!