2011-10-12 5 views
7

저는 작은 커널 모듈을 만들어 ARMv7 칩 (특히 캐시 제어)의 일부 커널 모드 전용 기능에 대한 사용자 공간 액세스를 제공합니다. 나는 을 통해 Corbeet, Rubini 및 Hartman의 리눅스 장치 드라이버을 읽었습니다. 그 안에는 전체 드라이버 + 장치 + 버스를 만드는 방법이 설명되어 있습니다. 나는 버스 운전사를 전혀 만들고 싶지 않다. 실제로 내가 만들고있는 '드라이버'는 실제로 장치 정의와 일치 할 필요가 전혀 없습니다. 플랫폼의 CPU와 암묵적으로 일치합니다. 누구든지 내게 설명 할 수 있겠습니까?sysfs를 통한 Linux 드라이버 액세스

  1. sysfs에서 내 특성을 사용해야하는 위치는 어디입니까? 내 모듈 항목에 /sysfs/modules/mymodule 아래에 있어야합니까? /sys/devices/platform도 유망 해 보이며, /sys/devices/system/cpu도 마찬가지입니다.
  2. kobject/속성을 넣어야하는 기존 장소가있는 경우 어떻게 연결해야합니까? 필요한 것을 얻으려면 어떻게해야합니까 kset? 내가 본 모든 예는 kset을 만들고 kobject에서 연결합니다. 기존에 요청한 API 인 kset을 보지 못했습니까?

죄송 합니다만 이것이 극히 드문 경우 또는 일부 이유 때문에 발견되지 않은 매우 간단하고 쉽게 발견 된 예제가있는 경우 미안합니다. 누구든지 이것에 대해 어떤 생각을 밝힐 수 있습니까?

답변

8

필자는 sysfs를 많이 다루지는 않았지만, 당신이하는 일과 매우 흡사 한 단순한 예제를 발견했습니다 (당연히 ARM에서도 마찬가지입니다). arch/arm/mach-omap1/pm.c, 특히 idle_show/idle_store sysfs 파일을 살펴보십시오. 그것은 (sysfs_create_file()을 사용하여) /sys/power/sleep_while_idle으로 등록되고 세계 kobj (include/linux/kobject.h에서 정의 됨)를 사용합니다. 당신이 사용할 수있는 몇 가지 다른 글로벌 코비 (kobj)가 있습니다 만, 나는 당신의 운전자에게 맞는 제품이 없다고 생각합니다.

플랫폼 드라이버가 될 예정입니까? 어떤 버스에도 맞지 않는 운전자에게는 좋은 느낌 인 것 같습니다. 플랫폼 드라이버는/sys/devices/platform 아래에 자체 디렉토리를 가지며 거기에 속성을 가질 수 있습니다. , temp1_crit_alarm, temp1_input 등을 속성으로 갖는 drivers/hwmon/coretemp.c을 살펴보십시오. 매우 간단합니다 : 속성을 작성하십시오 (어쩌면 __ATTR()?). 배열에 모두 나열하고 attribute_group을 정의하고 함수로 probe()에 등록하고 remove() 함수에서 sysfs_remove_group()을 등록 취소하십시오.

다른 예제가 필요한 경우 특성을 정의하는 다른 플랫폼 드라이버가 있습니다 (sysfs_create_group 검색). 희망이 도움이!

+0

coretemp.c 드라이버를 살펴 보겠습니다. 감사! –

+0

업데이트 - coretemp 모듈은 완벽한 템플릿이었습니다. 몇 가지 sysfs 속성이 아주 멋지게 작동합니다. 다시 한번 감사드립니다. –