En los artículos de modelo de controlador de dispositivo Linux de

  

modelo de dispositivo Linux, basta con ver la introducción teórica, como LDD3 Capítulo XIV, el resumen se sentirá difícil de entender, fácil de entender y más concretamente mediante la lectura de código del núcleo, por lo que la combinación de la teoría introducción y código del núcleo se pueden leer con mayor rapidez entender y comprender el modelo de dispositivo Linux. El propósito de este artículo es que en esta secuencia, antes de mirar a estos artículos es mejor leer atentamente el capítulo XIV LDD3. La mayor parte de dispositivo y el conductor están incluidos en un autobús, en particular, platform_device y platform_driver es el caso, contenida en platform_bus_type en. Platform_bus_type aquí para llamar a la línea principal, el análisis de la orden platform_driver proceso de registro para comprender modelo de dispositivo Linux. platform_bus_type asociado SOC para el controlador de dispositivo plataforma y la plataforma, tal como el núcleo de Linux-2.6.29 S3C2410 en todo el dispositivo de plataforma se guardan en la devs.c. Aquí es analizar platform_driver_register () llama al procedimiento de rutina al ejemplo S3C2410 controlador RTC RTC-s3c.c. En el último artículo de este ejemplo, fijado con una imagen del modelo de dispositivo, este artículo puede ser leído en el momento como referencia. Antes de leer este artículo, lo mejor es leer el artículo "Sobre los papeles de dispositivos modelo de dispositivo Linux."

a, S3C2410 RTC platform_driver definido en drivers /RTC código /RTC-s3c.c es el siguiente: static struct s3c2410_rtc_driver platform_driver = {, la sonda = s3c_rtc_probe, (quitar = __devexit_p (s3c_rtc_remove, suspender = .. .. s3c_rtc_suspend, reanudar = s3c_rtc_resume} = conductor, ". name = " S3C2410-RTC, propietario = THIS_MODULE, {; .. {Desde el nombre = " S3C2410-RTC ", los análisis posteriores que se convertirá en una el nombre del directorio, que está detrás de la /sys/bus/platform/s3c2410-rtc.s3c_rtc_probe llamadas ha analizado el uso platform_driver_register () se mencionará antes del hecho, "el modelo de dispositivo capítulos equipos Linux" () Register s3c2410_rtc_driver, analizarla dos aquí, platform_driver_register () de rutina se define en la base /código drivers /platform.c es como sigue :. int platform_driver_register (struct platform_driver * drv)} DRV- > driver.bus = &platform_bus_type; //establecer platform_bus_typeif (DRV- > sonda) DRV- > driver.probe = platform_drv_probe; //device_driver el vertedero si (DRV- y gt; quitar) DRV- > driver.remove = platform_drv_remove; si (DRV- > apagado) DRV- > driver.shutdown = platform_drv_shutdown; si (DRV- > suspender) DRV- > driver.suspend = platform_drv_suspend; si (DRV- > reanudar) DRV- > driver.resume = platform_drv_resume; driver_register retorno (&DRV- > conductor); //esta rutina para registrar device_driver Bus, {código más tarde análisis, 1. establecer platform_bus_type esto es muy importante porque el controlador y el dispositivo están unidos entre sí por un bus, específicamente en este caso está por platform_bus_type registrado rutina de devolución de llamada y las propiedades que deben alcanzarse, análisis del artículo equipo "modelo de dispositivo Linux en "que se menciona en el controlador coincida con el dispositivo vuelve a la rutina de registro de Mach por platform_bus_type () para completar. Análisis de platform_bus_type por favor refiérase a "Linux análisis de modelo de dispositivo de los papeles de dispositivos." Aquí es driver_register análisis (). Tres, driver_register () de rutina se define en la base /código drivers /driver.c es como sigue: int driver_register (struct device_driver * drv)} int ret; struct device_driver * otra; //hacer determina si ((DRV- > BUS > sonda &&DRV- > sonda) | | (DRV- > bus- > & eliminan; &DRV- > quitar) | | (DRV- > bus- > apagado &&DRV- > apagado)) printk (KERN_WARNING " controlador '% s' necesita una reforma - por favor utilice " " tipoDeBus métodos \\ n ", DRV- > nombre); /* encontrar por el nombre del controlador de conductor, si lo encuentra, lo que indica ya registrado, devolverá un código de error seguido de análisis * /other = driver_find (DRV- > nombre, DRV- > bus), si (otro ) {put_driver (otra); printk (KERN_ERR " Error: Driver '% s' ya está registrado, " " abortar ... \\ n ", DRV- > nombre); regreso -EEXIST; {/* la conductor se añade al bus de la KSET, y genera estas carpetas y el archivo de enlace, más tarde los análisis * /ret = bus_add_driver (drv), si (RET) ret retorno; /* Añadir attribute_group, no previsto DRV- > presente realización; Grupos * /ret = driver_add_groups (DRV, DRV- > grupos), si (r) bus_remove_driver (DRV); retorno RET;. {código, como uno de los comentarios en inglés dicha rutina, la mayoría del trabajo en bus_add_driver () la rutina se ha completado. bus_add_driver () rutina es similar a la función del analizado "en el dispositivo Linux artículos de equipamiento modelo" bus_add_device (), excepto que este último añadir un dispositivo para coger el autobús. El análisis siguiente driver_find () de rutina. Dos, driver_find () de rutina para encontrar el controlador por la conducción pertenece el contenedor de autobuses, que se define en la rutina de los conductores /base drivers_kset /Código driver.c es como sigue: struct device_driver * driver_find (const char * nombre, estructura tipoDeBus * autobús) } struct kobject * k = kset_find_obj (bus- > p- > drivers_kset, nombre); //Encuentra la struct driver_private * recipiente priv drivers_kset; si (k) {priv = to_driver (k); volver priv- > conductor; //devuelve al conductor a encontrar el {return null; {código de 1 a kset_find_obj (BUS > p > drivers_kset, nombre). kobj localizar el controlador, los códigos son los siguientes, struct kobject * kset_find_obj (struct KSET * KSET, char const nombre *)} struct kobject * k; struct kobject * ret = NULL; spin_lock (&​​amp; kset- > list_lock); list_for_each_entry (k, &kset- > lista, entrada) {//iterate kset- > lista lista obtención kobj

Copyright © Conocimiento de Windows All Rights Reserved