2012-11-24 17 views
14

Ho scritto un semplice driver seriale UART in Linux occupato che esegue busybox con regole mdev. Ho fornito .dev_name come "ttyC2C" nel mio codice di guida.Nodo dispositivo su/dev/tty * non viene creato per driver seriale 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, 
}; 

Tuttavia il nodo è sempre creato in

./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 
/# 

Le regole MDEV per tty sono:

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

Come arrivare nodo del dispositivo come /dev/ttyC2C?

+0

Nel libro "Essenziali Linux Device Drivers", si dice che che il nome del driver in "struct platform_driver" e "struct uart_driver" dovrebbe essere lo stesso. Ho modificato il codice in base, ma il nodo still/dev/ttyC2C non viene popolato. –

+0

Quando aggiungo .major e .minor alla struct uart_driver e creo il nodo del dispositivo manualmente usando "mknod", il driver funziona correttamente. Perché il kernel (3.4.0) non è in grado di crearlo automaticamente? –

risposta

8

Stai confondendo due cose. I nodi sysfs che stai vedendo sono effettivamente gestiti dal kernel in base alla gerarchia di kobject. Tuttavia i nodi dei dispositivi sono interamente un problema di spazio utente e possono esistere ovunque (sebbene per convenzione siano sotto/dev).

Così a mano si dovrebbe prima trovare il maggiore: i numeri minori:

cat /sys/class/tty/ttyC2C0/dev 

E poi:

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

Tuttavia, come si è già indicato che si sta utilizzando la forcella di udev, mdev a gestire la creazione dello spazio utente dei nodi del dispositivo. Comunque le regole di abbinamento mi sembrano strane. Presumo che mdev abbia l'equivalente di udevadm che dovrebbe aiutarti a scrivere le regole di corrispondenza. Per esempio il mio autista tty USB può essere interrogato in questo modo:

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

E guardando l'albero producevo posso vedere un elenco di attributi di udev che ho potuto usare per abbinare. Quindi, nel mio caso:

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

sarebbe sufficiente per soddisfare (anche se il mio distro ha regole di corrispondenza molto più complesse da affrontare configurazioni dinamiche).

sto cercando di indovinare, ma ho il sospetto che la regola di mapping che si desidera apparirebbe più come: (? Minor number)

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

Anche se potrebbe essere necessario un po 'di più per essere sicuri di ottenere i nodi di device creati per ogni porta .

2

L'aggiunta di una specifica regola mdev al tuo /etc/mdev.conf per ttyC2C risolve il problema? Qualcosa come uno dei seguenti?

ttyC2C[0-9]+ root:tty 620

o

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