Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

안녕하세요~! 리눅스 드라이버에 관하여 질문있습니다.

작성자
인그니야
작성일
2018-12-10 16:51
조회
424
안녕하세요. 전에 iamroot에서 메모리 관련 질문에 답변해주신 이후로 이 블로그를 접했고 덕분에 많은 것을 배우고 있습니다.

지금 플랫폼 드라이버로 네트워크 인터페이스를 다루고 있습니다. 이 때 외부망과의 Rx, Tx 데이터들을 DMA를 이용하여 송수신하기 때문에 드라이버에서 DMA를 등록시켜 사용하고자 하는데, 이 DMA를 어떤 Device로 간주해야 할지 헷갈립니다.

1. 현재 Zynq soc를 사용하고 Soc PL 영역에 FPGA로 구현된 DMA를 사용합니다. 블로그의 Device driver 포스팅 글에서 DMA는 Device driver의 Class device로 등록시켜 사용하라고 명시가 되어있지만 제가 사용하려는 DMA는 Soc 내부에 임베드되어 있기 때문에 Platform device인 것 같기도 하고요( 그리고 Platform device 구조체에서도 DMA멤버가 있기도 하죠). 어떤 Device로 등록하여 사용해줘야 할지 고민입니다.

2. 현재 드라이버가 플랫폼 디바이스 드라이버로 네트워크 드라이버가 구현되어 있어요. 갸우뚱해져서 커널 소스를 뒤져 다른 네트워크 드라이버 소스들을 보니 대부분 플랫폼 드라이버를 기반으로 구현을 했더라구요. 그냥 네트워크 드라이버만으로 구현을 했을 경우에 대비해 이 방법이 무슨 이점이 있는 것인지 골똘히 생각해봐도 잘모르겠습니다.
전체 2
  • 2018-12-11 16:57
    안녕하세요? 어려운 일들을 하시고 있군요?

    1번 질문의도를 보아 DMA 컨트롤러를 작성하고 이를 사용해야 하는 상황인듯합니다.
    DMA controller는 일반적으로 플랫폼 디바이스로 작성하면 됩니다. (클래스 디바이스는 잘못된겁니다. -다른 의도의 설명인듯 합니다-)
    물론 FPGA가 SoC 내부 AXI 버스등에 연결된 것이 아니라 PCIe 버스에 연결된 경우에는 PCI 디바이스로 등록해야 하는데 이러한 경우는 아닌것으로 보입니다.

    2. 네트워크 디바이스 드라이버도 SoC 내부에 AXI 버스등과 연결된 경우의 네트워크 디바이스라면 당연히 플랫폼 디바이스로 작성됩니다. 만일 SoC 외부의 PCI나 USB 뒤에 연결된 경우는 PCI나 USB 디바이스 드라이버로 작성해야합니다. 참고로 SoC 내부에 AXI버스에 연결된 네트워크 디바이스를 플랫폼 디바이스로 작성하지 않는 경우는 거의 없다고 보시면 됩니다.
    각 네트워크 드라이버 소스에서 대부분 뒷 부분에 드라이버 등록 시 다음 중 하나를 많이 사용합니다.
    - module_platform_driver()
    - module_pci_driver()
    - module_pcmcia_driver()
    - module_usb_driver()

    도움이 되시길 바랍니다.

  • 2018-12-11 17:04
    참 일부의 경우이긴 하지만 amba 디바이스로 연결된 DMA 컨트롤러도 있습니다.(ex: arm,pl330)