Linux kernel interfaces de dispositivos de caracteres

  

es el más grande de hardware dispositivo de caracteres, tales como la pantalla táctil común, lcd similares.

considera que en general requieren de acceso secuencial de datos pertenecen a un dispositivo de caracteres, la tarjeta también se puede considerar un dispositivo de caracteres, excepto que la red requiere una gran cantidad de procesamiento asociada con la pila de protocolos. Las características de los dispositivos de bloque son: leer y escribir datos en un bloque, pero lo más importante se puede acceder de inmediato.

2.6 del kernel que el operativo 2.4 del kernel más complicado, pero más de la estructura y el principio para evitar problemas innecesarios, mejorar científica. El siguiente es el autor de una reciente ejemplo de una unidad, con la esperanza de elaborar o dos.

desarrollo impulsado lleva a cabo de forma modular, porque al final tenemos que conducir a servir a la aplicación de software superior, que obliga al conductor a estar en ejecución en el espacio del núcleo,
sistema operativo en tiempo de ejecución, tenemos que utilizar de manera fija los controladores en el núcleo, el módulo proporciona un método para nosotros. Por lo general, el módulo requiere tres partes importantes: MODULE_LICENSE (" GPL "); module_init (dvr_tdm_init); module_exit (dvr_tdm_exit);

tdm_init y tdm_exit en función del nombre, requiere una aplicación específica en un módulo, de la siguiente manera:

file_operations static struct dvr_tdm_fops = {lea: dvr_tdm_read, escriben: dvr_tdm_write, abierta: dvr_tdm_open, la liberación: dvr_tdm_release,}; #if 0 esta estructura contiene una gran cantidad de punteros de función, el aumento de la aplicación de estas funciones pueden ser implementadas muchas características avanzadas, tales como: 1, para lograr de no bloqueo en el dispositivo de bloqueo (utilizado principalmente DECLARE_WAIT_QUEUE_HEAD (nombre); init_waitqueue_head (wait_queue_head_t * nombre); wait_event_interruptible (cola, condición) wake_up_interruptible void (wait_queue_head_t * cola); ver: competencia concurrente 2, concurrente con la competencia 3, 0,4 implementar soporte para seleccionar las funciones para lograr el espacio mmap.5 núcleo, el hardware de control io
.

#E NDIF

estructura estática cdev * dvr_tdm_cdev; tdm_dev_t st_dev estática;

static int __init dvr_tdm_init (void) {ret = alloc_chrdev_region (&tdm_dev_t, 0, DVR_TDM_COUNT, DRV_NAME), si (r! = 0) {printk (KERN_ERR " fallido alloc_chrdev_regin \\ n "); valla a cabo;} dvr_tdm_cdev = cdev_alloc (); dvr_tdm_cdev- > ops = &dvr_tdm_fops; dvr_tdm_cdev- > propietario = THIS_MODULE; //init interfacescdev_init conductor ( dvr_tdm_cdev, &dvr_tdm_fops); depuración (" dvr_tdm_init :! dispositivo chr inicializa \\ n ");

ret = cdev_add (dvr_tdm_cdev, tdm_dev_t, DVR_TDM_COUNT), si (r) {printk (" dvr_tdm_init: dispositivo CHR añadido \\ n ");} else {printk (" dvr_tdm_init: no puede agregar CHR dispositivo \\ n ");} salida: ret retorno;}

dvr_tdm_exit __exit static void (void) {unregister_chrdev_region (tdm_dev_t , DVR_TDM_COUNT); cdev_del (dvr_tdm_cdev);} function antes y nombre de la función __init __exit: __ salida declarar el inicio del código en la zona de inicio del kernel, el código de área se ejecuta sólo una vez, después del final de la carrera, el código es desechado. __exit código de la etiqueta desechada. Estas dos afirmaciones son para ser añadido al núcleo cuando el módulo está en preparación, aunque sólo sea en el módulo independiente, la afirmación anterior no tiene sentido. Aquí están la realización básica de la unidad de función de liberación abierta de lectura y escritura. static int dvr_tdm_open (struct nodo-i * i-nodo, struct file * filp) {if //Si el módulo se ha insertado en el núcleo, el módulo incrementa la cuenta de referencia (try_module_get (THIS_MODULE)!), si el módulo no se ha insertado en el núcleo, devuelve 0 representa Se produjo un error. printk (" try_module_get error \\ n "); depuración (" dvr_tdm_open: run conductor bien \\ n ");

return 0;}

dvr_tdm_write ssize_t estática (file archivo * estructura, const __user char * buf, recuento size_t, loff_t * offset) {short firmado int pcm_buffer [TDM_FRAME_LENGTH]; int ret; ret = copy_from_user (pcm_buffer, buf, cuenta); si (RET) printk (" dvr_tdm_write: hay% x bytes no puede leer de usuario \\ n ", ret); //...... return 0;}

static int dvr_tdm_release (struct nodo-i * i-nodo, struct file * filp) {module_put (THIS_MODULE ); de depuración (" dvr_tdm_release: versión del controlador ok \\ n ");

return 0;}

dvr_tdm_read ssize_t estática (estructura de archivos de archivos *, char * buf __user, recuento size_t, loff_t * pos) {short firmado int pcm_buffer [TDM_FRAME_LENGTH]; int ret; //.... obtener ret datos = copy_to_user (buf, pcm_buffer, TDM_FRAME_LENGTH), si (RET) printk (" dvr_tdm_read: hay% x bytes puede 't leer por el usuario \\ n ", ret); return 0;}

Makefile: ifneq ($ (KERNELREASE),) obj-m + = Mpc8315_tdm.oelseKERNELDIR = /home /Wilson /ltib /rpm /BUILD /Linux /buildobj-m + = dvr_tdm.odvr_tdm-objs :? = Tdm_driver.oPWD: = $ (pwd shell) ALL: (HAZ) ARCH $ = PowerPC CROSS_COMPILE = PowerPC-e300c3-linux-gnu- O = construir -C $ (KERNELDIR) M = $ (PWD) modulesclean: rm * .o * .koendif

nodos de dispositivo creado :! # /bin /sh

module = " dvr_tdm " device = " dvr_tdm " mode = 664error = " Error: no se puede encontrar el dvr del dispositivo TDM "

insmod ./$module.ko $ * | |  salida 1major = `/proc /devices gato |  grep dispositivo $ |  awk '{print $ 1}' 'if [-z $ importante] then echo $ error; 1fi salida

rm -f /dev /$ {} dispositivo

Copyright © Conocimiento de Windows All Rights Reserved