2012-11-24 5 views
14

Napisałem prosty sterownik szeregowy UART we wbudowanym systemie Linux z systemem busybox z regułami mdev. Podałem .dev_name jako "ttyC2C" w moim kodzie sterownika.Węzeł urządzenia w/dev/tty * nie jest tworzony dla sterownika szeregowego uart

static struct uart_driver serial_omap_reg = { 
    .owner  = THIS_MODULE, 
    .driver_name = "Omap-C2C-Serial", 
    .dev_name = "ttyC2C", 
    .nr  = OMAP_MAX_HSUART_PORTS, 
    .cons = NULL, 
}; 

Jednak węzeł jest uzyskiwanie tworzony w

./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0 
./sys/class/tty/ttyC2C0 

/# ls -l ./sys/class/tty/ttyC2C0 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 ./sys/class/tty/ttyC2C0 -> ../../devices/platform/omap_c2c_uart.0/tty/ttyC2C0 

/# ls -l ./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0 
-r--r--r-- 1 root  0    4096 Jan 1 00:14 dev 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 device -> ../../../omap_c2c_uart.0 
drwxr-xr-x 2 root  0    0 Jan 1 00:14 power 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 subsystem -> ../../../../../class/tty 
-rw-r--r-- 1 root  0    4096 Jan 1 00:14 uevent 
/# 

Przepisów mdev dla terminala są:

tty 0:5 0666 
tty.* 0:0 0620 

Jak zdobyć węzeł urządzenia jako /dev/ttyC2C?

+0

W "Essential Linux sterowników urządzeń" książki, to mówi, że nazwa sterownika w "struct platform_driver" i "struct uart_driver" powinny być takie same. Zmodyfikowałem kod, ale nadal/dev/ttyC2C węzeł nie jest wypełniany. –

+0

Kiedy dodaję .major i .minor do struct uart_driver i utworzę węzeł urządzenia ręcznie za pomocą "mknod", wtedy sterownik działa poprawnie. Dlaczego jądro (3.4.0) nie jest w stanie utworzyć go automatycznie? –

Odpowiedz

8

Mylą dwie rzeczy. Widoczne węzły sysfs są rzeczywiście utrzymywane przez jądro w oparciu o hierarchię kobject. Jednak węzły urządzeń są całkowicie problemem przestrzeni użytkownika i mogą istnieć w dowolnym miejscu (choć zgodnie z konwencją są w/dev).

Więc ręcznie należy najpierw wybrać kierunek: drobne numery:

cat /sys/class/tty/ttyC2C0/dev 

, a następnie:

mknod /dev/ttyC2C0 c ${MAJOR} ${MINOR} 

Jednak jak już wskazano używasz rozwidleniu udev, mdev do obsługiwać tworzenie przestrzeni użytkownika węzłów urządzeń. Jednak zasady dopasowania wydają mi się dziwne. Zakładam, że mdev ma odpowiednik udevadm, który powinien pomóc ci napisać pasujące reguły. Na przykład mój kierowca tty USB można przeszukiwać tak:

udevadm info -a -p /sys/class/tty/ttyUSB0 

I patrząc na drzewo produkowanego mogę zobaczyć listę atrybutów udev, które można używać do meczu. Tak więc w moim przypadku:

KERNEL=="ttyUSB0", DRIVERS=="ftdi_sio", NAME="ttyUSB0" 

Wystarczyłoby dopasować (chociaż moja dystrybucja ma dużo bardziej złożone reguły dopasowania, aby radzić sobie z dynamicznymi konfiguracjami).

Zgaduję, ale podejrzewam regułę mapowania chcesz wyglądają bardziej jak: (? Drugorzędny numer)

KERNEL=="ttyC2C", NAME="ttyC2C" 

Choć może trzeba trochę więcej, aby uzyskać węzły urządzeń stworzonych dla każdego portu .

2

Czy dodanie konkretnej reguły mdev do /etc/mdev.conf dla ttyC2C rozwiązuje problem? Coś jak jeden z poniższych?

ttyC2C[0-9]+ root:tty 620

lub

ttyC2C[0-9]+ root:tty 620 @/bin/ln -sf $MDEV ttyC2C

Powiązane problemy