>php教程 >PHP开发 >임베디드 Linux 시스템용 키보드 드라이버 구현 (1) (2)

임베디드 Linux 시스템용 키보드 드라이버 구현 (1) (2)

黄舟
黄舟원래의
2016-12-23 14:03:371586검색

초기화 부분. 이 부분에는 하드웨어 계층과 소프트웨어 계층의 초기화가 포함됩니다. 이 예에서는 CPU가 제어하고 액세스할 수 있도록 먼저 SN74hc164 칩에서 사용하는 매트릭스 회로와 GPIO 포트를 구성해야 합니다. GPIO 포트를 입력, 출력 또는 인터럽트 소스로 구성하려면 해당 GPIO 제어 레지스터에서 올바른 값을 설정해야 합니다. 구체적인 값은 S3C2410 개발 보드 매뉴얼을 참조하여 얻을 수 있습니다. 예를 들어 GPB1을 SN74hc164의 입력 단자로 설정하려면 GPBCON 제어 워드의 두 비트 2와 3을 이진수 01로 설정해야 합니다. GPG6을 저전압 점프 인터럽트 소스로 설정하려면 두 비트 12와 3을 설정해야 합니다. GPGCON의 13번 비트는 2진수 10으로 설정되어야 합니다. 하드웨어 초기화 작업이 완료되면 소프트웨어 계층에서 초기화가 진행됩니다. 먼저 키보드 인터럽트 처리 기능을 시스템에 등록한 다음, 인터럽트가 발생하면 타이머가 키보드의 검색 작업을 트리거하도록 타이머 구조를 설정합니다. 마지막으로 매트릭스 회로의 16개 열은 SN74hc164를 통해 0으로 설정됩니다.

인터럽트 처리 부분. 앞서 언급했듯이 소프트웨어의 이 부분이 수행해야 하는 작업은 특수 키보드를 스캔하고, 어떤 키를 눌렀는지 확인하고, 안정적인 스캔 코드를 얻은 다음 커널 내보내기 함수인 handler_scancode를 호출하는 것입니다. 이 애플리케이션에서는 특수 키보드의 레이아웃이 PC 표준 키보드의 레이아웃과 유사하므로 PC 키보드의 해당 키에 대한 시스템 스캔 코드를 당사 특수 키보드의 각 키에 대한 스캔 코드로 직접 사용하며, 동시에 PC 키보드 드라이버를 사용합니다. 스캔 코드에서 키 코드로의 변환 기능인 pckbd_translate가 kbd_translate 기능으로 사용됩니다.

어떤 키가 눌렸는지 판단하는 알고리즘은 다음과 같습니다. 인터럽트가 발생하면 인터럽트 번호를 기반으로 누른 키가 어느 행에 있는지 이미 확인할 수 있으며 누른 키가 어느 열에 있는지도 확인해야 합니다. 이를 위해 먼저 직렬로 연결된 두 개의 SN74hc164 칩에 CLR 신호를 보내고 이를 클리어한 다음 16개의 1을 보내 특수 키보드의 열이 모두 High가 되도록 합니다. 이때 행에서 읽은 내용은 다음과 같습니다. 키보드의 포트는 모두 높습니다. 16개의 클럭 펄스에서 1 0과 15 1이 SN74hc164 칩으로 전송되므로 각 열에 0이 한 번만 나타나고 동시에 키보드 행 포트가 스캔됩니다. 누른 키의 열이 0으로 설정되면 키가 위치한 행이 낮은 레벨로 읽혀집니다. 이 "walk 0 방법"을 사용하면 키보드에서 어떤 키를 눌렀는지 확인할 수 있습니다. 하지만 이 간단한 스캐닝 알고리즘만으로는 충분하지 않습니다. 이러한 유형의 매트릭스 스캐닝 키보드에서는 키를 누르고 들어올릴 때마다 10~20ms의 버 지터가 발생하기 때문입니다(이 기간의 길이는 하드웨어 특성에 따라 결정됨). . 디버링의 일반적인 방법은 키보드 인터럽트가 도착했을 때 즉시 키보드를 스캔하는 것이 아니라 일정 시간 동안 기다렸다가 버 지터를 건너뛴 후 키보드를 스캔하는 것입니다.

잠시 기다렸다가 지터를 건너뜁니다.

키보드에서 아무 키도 누르지 않은 경우

종료하고 돌아갑니다. 키보드의 키가 눌려졌습니다.

잠시 기다렸다가 같은 키가 계속 눌려져 있는지 확인하세요.

계속 같은 키가 눌려져 있으면

읽기 스캔을 반환합니다. code;

else

이 솔루션은 확실히 가능하지만 바쁜 대기 기간 동안에는 바쁜 대기 방법을 사용합니다. 유용한 일을하십시오. 이는 컴퓨팅 리소스가 제한된 임베디드 Linux 시스템에 있어 사치스러운 낭비입니다. 이 애플리케이션에서 우리는 임베디드 시스템에 적합한 디버링 솔루션을 설계하여 좋은 결과를 얻었습니다.

Linux 커널은 타이머 대기열을 제공하므로 이 메커니즘을 사용하여 바쁜 대기를 방지하고 시스템 성능을 향상시킬 수 있습니다. 키보드의 키를 누르면 키보드 인터럽트 핸들러는 먼저 인터럽트 소스를 닫고 폴링 모드로 들어간 다음 타이머 목록 개체를 타이머 대기열에 추가한 후 종료됩니다. 커널에 연결된 타이머는 시간에 맞춰 트리거되며 트리거되는 기능은 다음 작업을 완료합니다. 먼저 전체 키보드의 모든 키를 스캔하고 스캔 결과를 정적 2차원 배열 변수 snap_shot_matrix[16 ][4 ]. 이 변수는 키보드 스캔에서 현재 키보드의 모든 키를 누르는 상태를 설명합니다. 키를 누르지 않은 경우, 즉 해제된 상태에서는 snap_shot_matrix의 해당 값이 0으로 설정됩니다. 키를 누르면 snap_shot_matrix의 해당 값이 1씩 증가합니다. 값이 1 증가한 후 미리 지정된 숫자보다 크면 안정적인 값으로 간주하고 16*4 크기의 다른 2차원 배열 변수 current_matrix의 해당 좌표에 값을 설정합니다. 1로 설정하고, 그렇지 않으면 0으로 설정합니다. 이 변수는 키보드의 현재 키 입력의 안정적인 값을 설명합니다. 즉, 먼저 이 스캔에서 얻은 샘플링 데이터를 처리하여 snap_shot_matrix에 저장한 다음 이 변수의 값을 기준으로 필터링하여 current_matrix를 얻습니다. 이 과정을 통해 디버링 처리를 수행합니다. 이번 스캔의 안정된 값인 current_matrix를 얻은 후 지난번에 얻은 안정된 값인 Previous_matrix와 비교하여 지난 스캔과 비교하여 이 순간 키보드의 키 조건이 달라졌는지, 그리고 이 순간의 키보드 조건이 바뀌었는지를 판단한다. 키를 눌렀는지 여부가 변경됩니다. 키보드의 아무 키도 누르지 않은 것으로 확인되면 키보드 인터럽트를 켜고 다시 인터럽트 모드로 전환하십시오. 키보드에서 키를 눌렀는데 마지막으로 스캔한 키와 다른 경우 즉시 키 처리 함수 process_key를 호출합니다. 이 함수는 키보드 드라이버에서 상위 수준 함수인 handler_scancode를 호출합니다. 키보드에서 누른 키가 마지막으로 누른 키인 경우 카운터가 특정 지정된 값에 도달하면 소위 자동 반복 기능이 시작됩니다. 즉, 사용자가 특정 키를 계속 누르고 있습니다. 드라이버는 자동으로 키보드 입력을 반복적으로 생성합니다. 누른 키가 변경되면 이 카운터는 0으로 설정됩니다. 그러나 키보드에 여전히 눌려진 키가 있는 한 현재 읽은 키보드 안정 값 current_matrix를 Previous_matrix에 복사하고 앞서 설명한 타이머 객체를 다시 커널 타이머 큐에 걸어 놓습니다. 그런 다음 전체를 스캔합니다. 키보드의 아무 키도 누르지 않을 때까지 키보드를 다시 누르십시오.

4결론

정보사회와 컴퓨터 소프트웨어, 하드웨어 기술의 발전으로 임베디드 정보제품의 디자인과 응용이 급속도로 발전하고 있으며, 임베디드 정보제품에 특수한 기능을 추가하는 것이 필요합니다. Linux 시스템. 키보드 드라이버의 필요성도 점점 더 일반화되고 있습니다. 이 기사에서는 Linux에서 키보드 드라이버의 전체 프레임워크를 소개한 후 S3C2410 개발 보드의 특수 키보드를 예로 들어 임베디드 Linux 환경에서 특수 키보드용 드라이버를 작성할 때 수행해야 하는 작업을 중점적으로 설명합니다. , 유사한 기반을 제공 개발은 아이디어와 참조를 제공합니다.


(T114)

위는 임베디드 리눅스 시스템의 키보드 드라이버 구현 내용(1)(2)에 대한 내용입니다. 관련 내용 PHP 중국어 홈페이지(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.