Wstęp
Czasami chcemy aby nasz moduł był bardziej uniwersalny i mógł obsługiwać dane peryferium, ale podłączone do różnych magistrali i pinów. My w tym celu wykorzystamy parametry przekazywane do modułów, będziemy mogli przekazać naszemu sterownikowi do którego pinu GPIO jest podłączona nasza dioda.
Implementacja
Ponownie będziemy bazować na kodzie z lekcji czwartej. Co do podłączenia diod, podłącz je do któregokolwiek wolnego pinu GPIO. Implementacja wygląda następująco:
#include <linux/gpio.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int pin = 48;
module_param(pin, int, 0);
static int __init led_init(void)
{
if (!gpio_is_valid(pin)){
pr_err("Invalid GPIO pin!!1\n");
return -ENODEV;
}
gpio_request(pin, "gpioLED");
gpio_direction_output(pin, 1);
gpio_export(pin, false);
return 0;
}
static void __exit led_exit(void)
{
gpio_set_value(pin, 0);
gpio_unexport(pin);
gpio_free(pin);
}
module_init(led_init);
module_exit(led_exit);
MODULE_AUTHOR("Adam Olek");
MODULE_LICENSE("GPL");
Nie będę się rozwodzić tutaj nad ustawieniami GPIO bo to już dobrze znamy, nas tutaj najbardziej interesują te dwie linijki:
static int pin = 48;
module_param(pin, int, 0);
Pierwsza z nich to zmienna, która będzie służyła do przechowywania parametru, w tym przypadku domyślnie wynosi 48. Druga z nich to makro, które służy do zdefiniowania parametru modułu. Przyjmuje ono trzy parametry- nazwę parametru(naszą zmienną), typ tego parametru(u nas jest to int, oczywiście mogą być użyte inne typy) oraz uprawnienia do odpowiadającego pliku w sysfs(w naszym przypadku taki plik nie istnieje więc takie uprawnienia nie mają żadnego sensu). I to wszystko na temat implementacji.
Przygotuj Makefile:
obj-m += 07_params.o
all:
make -C /ścieżka/do/zbudowanego/kernela M=$(PWD) modules
clean:
make -C /ścieżka/do/zbudowanego/kernela M=$(PWD) clean
I przebuduj moduł dla swojej płytki:
# BBB
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
# RPi4
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8
Testowanie sterownika
Prześlij zbudowany sterownik na swoją płytkę np. za pomocą scp. Tym razem ładowanie modułu będzie wyglądać nieco inaczej ponieważ będziemy podawać parametr:
sudo insmod 07_params.ko pin=49
Teraz pomimo, że w kodzie do zmiennej pin została przypisane wartość 48 zostanie ona nadpisana przez wartość 49. Przekazywany numer pinu musisz oczywiście dopasować do swojej konfiguracji.
Usunięcie modułu z systemu wygląda tak samo:
sudo rmmod 07_params