하드웨어와 통신할 장치 드라이버를 얻으려면 어떻게 해야 합니까?

하드웨어와 통신할 장치 드라이버를 얻으려면 어떻게 해야 합니까?

여기에 이미지 설명을 입력하세요.

사용자 공간 애플리케이션이 준비되어 있고, 장치 파일이 mknode되고, 장치 드라이버가 커널에 연결되어 있으며, UART 프로토콜이 있는 장치가 있습니다. 나는 장치 드라이버(하드웨어의 기본 주소와 IRQ 라인 번호를 가지고 있음)와 하드웨어 사이에 무슨 일이 일어나고 있는지 알아내려고 노력하고 있습니다. 사용자 공간 응용 프로그램이 요청을 하면 하드웨어 기본 주소가 있는 장치 드라이버가 이를 처리하고, 하드웨어가 요청을 하려고 하면 IRQ 라인을 활성화합니다.

질문:

  1. 8051 마이크로컨트롤러 같은 곳에 코드를 덤프해야 합니까?
  2. 언제 장치를 켜야 합니까?

교통 정체를 놓쳤어요.

답변1

PCI/PCIe 버스에는 하드웨어 자동 구성 기능이 있으므로 Linux 커널에는 모든 PCI/PCIe 장치의 하드웨어 ID를 읽을 수 있는 PCI 버스 드라이버가 포함되어 있습니다. 를 통해 lspci -nn이러한 ID를 직접 볼 수 있습니다.

현재 하드웨어에 대한 드라이버가 로드되지 않은 경우 커널은 다음과 같은 드라이버 모듈 로드 요청을 생성합니다.

modprobe pci:v0000<PCI vendor ID>d000<PCI device ID>sv<subvendor ID>sd<subdevice ID>bc<base class ID>sc<subclass ID>i<programming interface ID>

드라이버 모듈에는 해당 항목이 포함되어야 합니다. 모달 정보, modprobe일치하는 모듈을 찾는 데 사용됩니다. 를 실행하면 modprobe -c | grep pci:현재 설치된 모든 드라이버 모듈에 대한 모달리아 줄이 표시됩니다.

드라이버가 로드된 후(및/또는 핫플러그 가능 하드웨어에서 커널 수준 PCI(e) 핫플러그 이벤트가 있는 경우) 드라이버는 드라이버가 알고 있는 하드웨어를 찾습니다. 드라이버가 실행할 수 있는 장치를 찾으면 일반적으로 udev 핫플러그 이벤트를 트리거하여 필요한 장치 파일을 자동으로 생성합니다.

기본값이 사용 사례에 적합하지 않은 경우 udev 규칙을 사용하여 장치 파일의 경로, 이름, 소유권 및 권한을 수정하거나 임의의 스크립트 작업을 실행할 수 있습니다. 대부분의 경우 수동 작업은 필요하지 않으며 Linux는 mknod커널 버전 2.6부터 비영구 /dev장치 파일 시스템을 사용했기 때문에 mknod다음 재부팅 시 수동 명령의 효과가 손실됩니다.

운전사가능한장치가 감지되면 장치를 조사/초기화하기 위한 추가 단계가 수행됩니다. 또는 드라이버는 간단히 장치 노드에 해당하는 커널 측 인프라를 설정하고 사용자 공간의 입력을 기다릴 수 있습니다.

드라이버가 관련 하드웨어를 찾지 못하면 메모리에 로드된 상태로 유지되어 장치를 다시 찾도록 지시할 수 있는 커널 수준 핫플러그 이벤트를 기다립니다.

/dev/ttyS*그러나 PCI(e) UART 카드는 직렬 포트 장치(예: 장치 ) 로 감지될 가능성이 높습니다 . 직렬 포트 기술은 매우 오래되었기 때문에 포트에 연결된 것을 식별하기 위해 직렬 포트를 조사하는 신뢰할 수 있는 방법이 없습니다. 그러나 Linux에서는 일반적으로 gpsdGPS 수신기 장치와 같은 사용자 공간에서 구현됩니다. ModemManager3G/4G 무선 모뎀. 이러한 서비스는 직렬 포트를 조회하고, 포트의 핸드셰이크 회선 상태를 확인하고, 연결이 있는 것으로 나타나면(즉, 직렬 포트의 수신 DSR 회선이 활성 상태인 경우) 수신 데이터를 찾거나 일부 표준을 보냅니다. 쿼리 문자열 .

예를 들어, ModemManager는 AT새로운 직렬 포트로 전송할 수 있습니다. 장치가 응답하면 OK상대방의 장치는 고전적인 Hayes AT 명령을 이해하는 것처럼 보이므로 아마도 일종의 모뎀일 것입니다. 좀 더 정확하게 식별해 보세요.

이 활성 프로빙은 UART 장치의 특정 사용을 방해할 가능성이 있습니다. 필요한 경우 udev 규칙을 사용하여 ModemManager에 특정 UART 장치를 완전히 무시하도록 지시할 수 있습니다.

예를 들어, PCIe 직렬 카드가 있는 시스템이 있습니다.

# lspci -nn
...
04:00.0 Serial controller [0700]: Oxford Semiconductor Ltd OXPCIe952 Dual 16C950 UART [1415:c158]
...

두 개의 포트가 있으며 udevadm info -q all -a -n /dev/ttyS<number>내 모든 /dev/ttyS*장치에서 이를 실행하면 포트를 식별할 수 있습니다. 첫 번째 포트에는 udev 속성이 있고 ATTR{line}=="1"두 번째 포트에는 ATTR{line}=="2".

이제 특수 직렬 장치를 해당 카드의 포트 1번에 연결하고 다음과 같은 파일에 udev 규칙을 작성할 수 있습니다 /etc/udev/rules.d/99-my-uart-device.rules.

SUBSYSTEM=="tty", DRIVERS=="serial", ATTRS{vendor}=="0x1415", ATTRS{device}=="0xc158", ATTRS{line}=="1", ALIAS="my_serial_device", ENV{ID_MM_DEVICE_IGNORE}="1"

/dev/my_serial_device이 규칙 을 사용하면 시스템에 추가할 수 있는 다른 UART 유사 장치와 감지 순서에 관계없이 항상 해당 직렬 포트 카드의 포트 1번을 참조하는 별칭(기호 링크)이 생성됩니다. 또한 ModemManager에게 이 포트(이 ENV{ID_MM_DEVICE_IGNORE}="1"부분)를 조사하지 말라고 지시합니다.

/dev/my_serial_device이제 이를 수행 하도록 애플리케이션을 설정할 수 있으며 /dev/ttyS1, 이 애플리케이션이 항상 올바른 물리적 직렬 포트를 사용하여 장치와 통신할 것이라고 신뢰할 수 있습니다.

직렬 카드는 PCIe 슬롯을 통해 전원이 공급되므로 항상 컴퓨터와 함께 전원이 공급되고 감지됩니다. 포트에 연결된 장치는 해당 장치를 사용하는 애플리케이션이 시작될 때까지 전원이 꺼진 상태로 유지될 수 있습니다.

관련 정보