2012-10-30 2 views
1

microblaze 아키텍처를위한 cpufreq 드라이버 (로드 가능한 커널 모듈로)를 개발 중입니다. 나는 시스템 클럭을 스케일 할 수있는 FPGA 로직을 가지고 있으며, 이것은 꽤 잘 작동한다. 나는 Documentation/cpu-freq/cpu-drivers.txt에있는 정보를 따라 blackfin cpufreq 드라이버에서 모델을 살펴 보았습니다./sys/devices/system/cpu/cpuX를 만드는 리눅스 커널 코드는 무엇입니까?

커널 (모듈 아님)에 cpufreq 옵션을 내장하기 위해 필요한 변경 사항을 arch/microblaze/Kconfig으로 변경했습니다.

드라이버를 처음로드했을 때 cpufreq_register_driver()이 -ENODEV를 반환 했으므로 CPU를 찾을 수 없다는 의미입니다. 드라이버 플래그를 CPUFREQ_STICKY로 설정하고 모듈을 삽입 할 수있었습니다.

그러나이 시점에서 나는 /sys/devices/system/cpu/cpu0이 존재하지 않는다는 것을 알았지 만 (/sys/devices/system/cpu/cpufreq이 있지만). 그래서, 왜 그런가요? 커널 코드에서 그 디렉토리를 생성하는 부분은 무엇입니까?

답변

1

cpufreq_cpu_callback()을 보면 /sys/devices/system/cpu/cpuX sysfs 항목이 생성 된 곳은 drivers/cpufreq/cpufreq.c입니다. 이것은 get_cpu_sysdev()으로 전화를 걸었습니다. 제가 찾고 있었던 요소라고 생각했습니다.

이 호출은 drivers/base/cpu.c에 정의되어 있습니다.이 호출은 cpu 특정 sysdev 항목을 함께 사용하는 코드에도 나타납니다. register_cpu(). 대부분의 아키텍처에서 이는 arch/${ARCH}/kernel/setup.c에 있으며 예를 들어 blackfin 코드를 사용했습니다.

DEFINE_PER_CPU(struct cpu, cpu_data); 
static int __init topology_init(void) 
{ 
    unsigned int cpu; 
    for_each_possible_cpu(cpu) { 
     register_cpu(&per_cpu(cpu_data, cpu), cpu); 
    } 
    return 0; 
} 

arch/microblaze/kernel/setup.c이 코드를 추가 한 후, 지금 내가 원하는 디렉토리를하고 난 내에는 cpufreq 드라이버 얘기를 사용할 수있는 다양한 총재 사용을 할 수 있어요. 이제는 sleep 1을 3 초 대신 1/3의 속도로 1 초 걸리면됩니다.