Lekcja 07- Parametry modułów

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
Ten wpis został opublikowany w kategorii Kurs pisania sterowników. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *