둘 이상의 드라이버가 적용 가능한 경우 장치에 사용할 드라이버를 어떻게 지정합니까?

둘 이상의 드라이버가 적용 가능한 경우 장치에 사용할 드라이버를 어떻게 지정합니까?

나는 원래 회사가 무너졌지만 하드웨어는 오픈 소스 커뮤니티에서 잘 지원되는 단일 보드 컴퓨터에서 작동하는 보다 현대적인 Linux를 얻기 위해 노력하고 있습니다. 매우 좋은 진전을 이루었지만 특정 장치에 대해 잘못된 드라이버 모듈이 로드되는 문제가 발생했습니다.

플랫폼은 Allwinner R8(Allwinner A13과 동일)이고 장치는 저항막 방식 터치스크린입니다. 배포판은 ARM용 Slackware-current입니다. 즉, systemd는 없지만 eudev를 사용함을 의미합니다. Mali lima 드라이버를 사용해 보고 싶었고 어쨌든 distro 빌드에 포함되지 않은 일부 모듈이 필요했기 때문에 소스에서 커널 5.2.0-rc6을 컴파일했습니다. 장치 트리의 관련 섹션은 다음과 같습니다.

u-boot/arch/arm/dts/sun5i.dtsi:

587         rtp: rtp@1c25000 {                                                                                                                                                                 
588             compatible = "allwinner,sun5i-a13-ts";                                                                                                                                         
589             reg = <0x01c25000 0x100>;                                                                                                                                                      
590             interrupts = <29>;                                                                                                                                                             
591             #thermal-sensor-cells = <0>;                                                                                                                                                   
592         };

오버레이(일부 장치의 트리 패치에 포함된 수정된 4.4 커널에 대해 제조업체의 오버레이에서 가져온 것입니다)

 76   /* Enable the touchscreen */                                                                                                                                                             
 77   fragment@4 {                                                                                                                                                                             
 78     target = <&rtp>;                                                                                                                                                                       
 79     __overlay__ {                                                                                                                                                                          
 80       touchscreen-inverted-x;                                                                                                                                                              
 81       touchscreen-inverted-y;                                                                                                                                                              
 82       allwinner,ts-attached;                                                                                                                                                               
 83     };                                                                                                                                                                                     
 84   };

문제는sun4i-gpadc나에게 필요한 것은 이 장치에 대한 모듈이 로드되는 것입니다.sun4i-ts. 전자는 범용 ADC 드라이버이고 후자는 나에게 필요한 터치스크린 드라이버입니다.

root@pocketslack:/etc# udevadm info -a /sys/devices/platform/soc\@1c00000/1c25000.rtp

  looking at device '/devices/platform/soc@1c00000/1c25000.rtp':
    KERNEL=="1c25000.rtp"
    SUBSYSTEM=="platform"
    DRIVER=="sun4i-gpadc"
    ATTR{driver_override}=="(null)"

modprobe를 사용하여 sun4i_gpadc 및 sun4i_ts를 제거한 다음 이를 사용하여 먼저 sun4i-ts부터 시작하여 로드하면 장치를 잡고 제대로 작동합니다.

root@pocketslack:/etc# modprobe -r sun4i_gpadc
root@pocketslack:/etc# modprobe -r sun4i_ts
root@pocketslack:/etc# modprobe sun4i_ts
root@pocketslack:/etc# modprobe sun4i_gpadc
root@pocketslack:/etc# udevadm info -a /sys/devices/platform/soc\@1c00000/1c25000.rtp

  looking at device '/devices/platform/soc@1c00000/1c25000.rtp':
    KERNEL=="1c25000.rtp"
    SUBSYSTEM=="platform"
    DRIVER=="sun4i-ts"
    ATTR{driver_override}=="(null)"

나는 이것을 처리할 것이라고 생각했던 회사의 이전 저장소에서 얻은 udev 규칙을 가지고 있지만 장치는 여전히 gpadc 드라이버에 의해 사용됩니다.

root@pocketslack:/etc# cat /etc/udev/rules.d/10-sun4i-ts.rules 
ACTION=="add", SUBSYSTEM=="input", DRIVERS=="sun4i-ts", SYMLINK+="input/sun4i-ts-%k"

나는 udev에 완전히 새로운 사람이라는 것을 인정할 것이므로 그 규칙이 무엇을 하라고 말하는지 정확히 모르겠습니다. 내 직감은 단지 해당 모듈을 로드하고 연결된 장치의 이름을 지정하는 방법을 알려주는 것입니다. 또한 sun4i-gpadc 드라이버가 전혀 필요한지 잘 모르겠지만 커널 문서에서 SoC의 열 센서가 작동하는 데 필요한 것으로 보입니다. 이 장치에는 프로젝트용 핀도 노출되어 있으므로 실제로 포함된 ADC를 그런 방식으로 사용하고 싶은 경우에 유용할 수도 있다고 생각했습니다. 또한 여러 가지가 적용될 수 있을 때 올바른 드라이버를 지정하기 위한 몇 가지 메커니즘이 있어야 하는 것처럼 보이며 gpadc 모듈을 빌드하거나 블랙리스트에 올리지 않는 것보다 그 방법을 배워야 한다고 생각했습니다.

답변1

이 특별한 경우에는 정말 비활성화하고 싶은 것 같습니다.sun4i_gpadc기준 치수. 나는 그것을 알아차렸다.ATTRS{driver_override}udevadm info이전에 눈치채지 못했던 위 출력 의 일부를 검색해 보니 장치 트리 항목이 '호환' 속성을 통해 모듈을 결정하는 방법에 대해 좀 더 자세히 알 수 있게 되었습니다. 이로 인해 modinfo두 모듈 모두 동일한 호환 가능한 문자열을 찾고 커널 구성을 다시 살펴본 후 드라이버가 호환되지 않는다는 것을 알았으므로 실제로 gpadc 드라이버를 빌드하거나 블랙리스트에 올리지 말아야 합니다. 경우에 따라 다름!TOUCHSCREEN_SUN4I.

Symbol: MFD_SUN4I_GPADC [=m]                                                                                                                                                           │   
  │ Type  : tristate                                                                                                                                                                       │   
  │ Prompt: Allwinner sunxi platforms' GPADC MFD driver                                                                                                                                    │   
  │   Location:                                                                                                                                                                            │   
  │     -> Device Drivers                                                                                                                                                                  │   
  │ (2)   -> Multifunction device drivers                                                                                                                                                  │   
  │   Defined at drivers/mfd/Kconfig:54                                                                                                                                                    │   
  │   Depends on: HAS_IOMEM [=y] && (ARCH_SUNXI [=y] || COMPILE_TEST [=n]) && !TOUCHSCREEN_SUN4I [=m]                                                                                      │   
  │   Selects: MFD_CORE [=y] && REGMAP_MMIO [=y] && REGMAP_IRQ [=y]

제대로 RTFMing하지 않은 것에 대해 사과드립니다 :)

관련 정보