PiScope (frambuesa Pi basado osciloscopio) (6 / 10 paso)

Paso 6: Escribir el módulo del núcleo

Crear un archivo de C llamado alcance-drv.c que contiene el código siguiente

#include < linux/kernel.h > #include < linux/module.h > #include < linux/fs.h > #include < asm/uaccess.h > < linux/time.h > del #include #include < linux/io.h > #include < linux/vmalloc.h > int init_module(void); void cleanup_module(void); Static int device_open (struct nodo *, struct file *); Static int device_release (struct nodo *, struct file *); ssize_t estática device_read (struct file *, char *, size_t, loff_t *); ssize_t estática device_write (struct file *, char const *, size_t, loff_t *); #define éxito 0 #define nombre_dispositivo "chardev" #define BUF_LEN 80 / * ajuste y macros para las conexiones de GPIO * / #define BCM2708_PERI_BASE 0 x 20000000 #define GPIO_BASE (BCM2708_PERI_BASE + 0 x 20000000) #define INP_GPIO(g) * (gpio.addr + ((g) / 10)) & = ~ (7 << (((g) % 10) * 3)) #define SET_GPIO_ALT(g,a) * (gpio.addr + (((g) / 10))) | = (((a) < = 3? () un) + 4:(a)==4?3:2) << (((g) % 10) * 3)) / * reloj GPIO * / #define CLOCK_BASE (BCM2708_PERI_BASE + 0x00101000) #define GZ_CLK_BUSY (1 << 7) / * número de muestras para capturar * / #define SAMPLE_SIZE 10000 / * pines GPIO definir * / / * ADC 1 * / #define BIT0_PIN 7 #define BIT1_PIN 8 #define BIT2_PIN 9 #define BIT3_PIN 10 #define BIT4_PIN 11 #define BIT5_PIN 25 / * ADC 2 * / #define BIT0_PIN2 17 #define BIT1_PIN2 18 #define BIT2_PIN2 22 #define BIT3_PIN2 23 #define BIT4_PIN2 24 #define BIT5_PIN2 27 struct bcm2835_peripheral {unsigned largo addr_p; int mem_fd; void * mapa; volátil unsigned int * addr;}; Static int map_peripheral (struct bcm2835_peripheral * p); Static void unmap_peripheral (struct bcm2835_peripheral * p); Static void readScope(void); Static int mayor; Static int Device_Open = 0; Static char mensaje [BUF_LEN]; Static char * msg_Ptr; Static unsigned char * buf_p; Static struct file_operations fops = {leer = device_read, .escriben = device_write, abrir = device_open, .release = device_release}; Static struct bcm2835_peripheral myclock = {CLOCK_BASE}; Static struct bcm2835_peripheral gpio = {GPIO_BASE}; struct DataStruct {uint32_t Buffer [SAMPLE_SIZE]; tiempo de uint32_t;}; struct DataStruct dataStruct; Static unsigned char * ScopeBufferStart; Static unsigned char * ScopeBufferStop; Static int map_peripheral (struct bcm2835_peripheral * p) {p -> addr =(uint32_t *) ioremap (GPIO_BASE, 41 * 4); return 0;} static void unmap_peripheral (struct bcm2835_peripheral * p) {iounmap (p -> addr);} static void readScope() {int contador = 0; estructura timespec ts_start, ts_stop; local_irq_disable(); local_fiq_disable(); getnstimeofday(&ts_start); while(counter<SAMPLE_SIZE) {dataStruct.Buffer[counter++]= * (gpio.addr + 13);} getnstimeofday(&ts_stop); local_fiq_enable(); local_irq_enable(); dataStruct.time = timespec_to_ns (& ts_stop) - timespec_to_ns(&ts_start); buf_p = (unsigned char *) & dataStruct; ScopeBufferStart = (unsigned char *) & dataStruct; ScopeBufferStop = ScopeBufferStart + sizeof (struct DataStruct); } int init_module(void) {struct bcm2835_peripheral * p = & myclock; int speed_id = 6; Principales = register_chrdev (0, nombre_dispositivo, & fops); Si (importante < 0) {han (KERN_ALERT "reg dev char fail %d\n",Major); return mayor;} ficheros (KERN_INFO "Importante número %d.\n", mayor); ficheros (KERN_INFO "creado un dev archivo con\n"); ficheros (KERN_INFO "'mknod /dev/%s % c d 0'. \n", nombre_dispositivo, mayor); Si (map_peripheral(&gpio) == -1) {han (KERN_ALERT "Error de mapa GPIO\n"); vuelta -1;} INP_GPIO(BIT0_PIN); INP_GPIO(BIT1_PIN); INP_GPIO(BIT2_PIN); INP_GPIO(BIT3_PIN); INP_GPIO(BIT4_PIN); INP_GPIO(BIT5_PIN); INP_GPIO(BIT0_PIN2); INP_GPIO(BIT1_PIN2); INP_GPIO(BIT2_PIN2); INP_GPIO(BIT3_PIN2); INP_GPIO(BIT4_PIN2); INP_GPIO(BIT5_PIN2); / * reloj señal al pin 4 * / p -> addr =(uint32_t *) ioremap (CLOCK_BASE, 41 * 4); INP_GPIO(4); SET_GPIO_ALT(4,0); *(myclock.addr+28)=0x5A000000 | speed_id; while(*(myclock.addr+28) & GZ_CLK_BUSY) {}; *(myclock.addr+29)= 0x5A000000 | (0x32 << 12) | 0; *(myclock.addr+28)=0x5A000000 | speed_id; devolver el éxito; } void cleanup_module(void) {unregister_chrdev (Major, nombre_dispositivo); unmap_peripheral (& gpio); unmap_peripheral(&myclock);} static int device_open (struct inode * inodo, struct file * archivo) {static int contador = 0; if(Device_Open) volver - EBUSY; Device_Open ++; sprintf (msg, "Llamado device_open %d times\n", contador ++); msg_Ptr = msg; readScope(); try_module_get(THIS_MODULE); devolver el éxito; } static int device_release (struct inode * inodo, struct file * archivo) {Device_Open-; module_put(THIS_MODULE); return 0;} ssize_t estática device_read (struct file * filp, char * buffer, size_t longitud, loff_t * offset) {int bytes_read = 0; si (* msg_Ptr == 0) return 0; mientras que (longitud & & buf_p < ScopeBufferStop) {si (0
! = put_user(*(buf_p++) buffer ++)) han (KERN_INFO "Problema con copy\n"); longitud--; bytes_read ++; } volver bytes_read; } device_write ssize_t estática (struct file * filp, const char * buff, size_t len, loff_t * off) {han (KERN_ALERT "esta operación no es compatible. \n"); volver - EINVAL;}

El programa contiene algunas funciones importantes. Para lograr un módulo del núcleo. el módulo necesita algunas funciones de entrada especial. Una de estas funciones es el init_module(), que se llama cuando se carga el módulo del kernel. Se llama a la función device_open() cuando se abre el archivo de dispositivo asociado con el módulo del kernel. Abrir el archivo de dispositivo hace que el ADC que leer 10.000 veces, donde los resultados se guardan en la memoria. La función device_release() es llamada cuando el dispositivo está cerrado. La función device_read() se llama cuando un proceso lee el archivo de dispositivo. Esta función devuelve las mediciones que se hicieron cuando se abrió el archivo de dispositivo. La última función device_write() es necesario para manejar el caso cuando un proceso intenta escribir en el fichero de dispositivo.

Más sobre el módulo de kernel: http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html

Se adjunta el programa completo, puedes subirlo utilizando FileZilla.

Artículos Relacionados

PiMSO - un Raspberry Pi basado osciloscopio de Wi-Fi

PiMSO - un Raspberry Pi basado osciloscopio de Wi-Fi

PiMSO, es una frambuesa Pi osciloscopio de señal mixta de 200 Msa/S. Dependiendo de la aplicación, se puede configurar para utilizar el navegador Midori en la GUI Pi o acceso remotamente a través de internet. Dado que el GUI de PiMSO es basado en web
Frambuesa Pi basado en RFID Music Robot

Frambuesa Pi basado en RFID Music Robot

Un par de semanas, vi esta genial Pi frambuesa basado en RFID activa de cassette, reproductor. Funcionó PiMusicbox y el fabricante creó un módulo de control PiMusicbox a través de RFID. Esto sería perfecto para mi hija de tres años. OK, ya que claram
Fácil frambuesa Pi basado en protector de pantalla/presentación de diapositivas para exposiciones y tiendas frente

Fácil frambuesa Pi basado en protector de pantalla/presentación de diapositivas para exposiciones y tiendas frente

En exposiciones a menudo quieren mostrar su trabajo con la esperanza de atraer a nuevos clientes potenciales. Esto también funciona para las ventanas de tiendas para anunciar productos a la venta dentro de. La mayoría simplemente crear un póster gran
ZYBO Digilent basado osciloscopio con LabVIEW

ZYBO Digilent basado osciloscopio con LabVIEW

Esto es un simple "osciloscopio" usando Zynq - 7000 y el programa de NI LabVIEW. Para adquirir datos de generador externo he utilizado incorporado 12 - bit, 1MSPS analógico al convertidor digital.He utilizado para generar las señales de salida D
3D impreso PI-alcance laboratorio herramienta

3D impreso PI-alcance laboratorio herramienta

Publicado por Element14 allí es un episodio muy interesante de Ben Heck, modding estos tres dispositivos creando un osciloscopio. Es mi opinión que esta versión propuesta tiene algunas limitaciones, por lo que he buscado cómo desarrollar una arquitec
'Lite' juego-consola de frambuesa Pi Nin10do

'Lite' juego-consola de frambuesa Pi Nin10do

Bueno, antes de empezar usted puede ver el vídeo para ver qué tipo de consola de juegos que vamos a crear...Es una estación de juegos de frambuesa Pi2 basado en que puedes jugar todos tus juegos favoritos de Mario a GTA y de Monkey Island para corred
Frambuesa PI y DHT22 temperatura y humedad logger con advertencias de la lámpara y el correo electrónico

Frambuesa PI y DHT22 temperatura y humedad logger con advertencias de la lámpara y el correo electrónico

Se trata de un registrador de temperatura y humedad de frambuesa Pi basado que utiliza 2 sensores de Adafruit DHT22 (funciona también con 1) para las mediciones. Usted podría haber visto semejante instrucciones antes, pero esta tiene un toque. No aca
DIY - Osciloscopio USB en una caja de cerillas

DIY - Osciloscopio USB en una caja de cerillas

Os presento un "Mejor de su clase", "Completa" DIY-USB osciloscopio que es "Verdaderamente DIY".Mi objetivo es proporcionar un barato osciloscopio de almacenamiento Digital para estudiantes, ingenieros de florecimiento y el a
Cámara de frambuesa Pi nube IP con POE

Cámara de frambuesa Pi nube IP con POE

Estaba inspirado por el trabajo de scavix con el instructable frambuesa Pi como cámara de vigilancia de HD de bajo costo así que decidí hacer mi propia frambuesa PI basado cámara IP que también cuenta con POE y soporta la integración con Google Drive
Servidor Mod caso de color frambuesa Pi

Servidor Mod caso de color frambuesa Pi

El propósito de este mod es crear un caso para la frambuesa Pi, basado en el caso de Adafruit creado por Mike Doell. Tendrá un mejor flujo de aire y ser fácilmente identificables por el color.Para este proyecto necesitarás:Disipador de calorDisipador
Pip-Boy 3000 con frambuesa

Pip-Boy 3000 con frambuesa

Hola amigosHoy les voy a de prototipo de mostrar como realizar un Pip Boy 3000 con frambuesa Pi basado en el trabajo de Grieve y que yo portado a la pantalla TFT capacitiva de Adafruit entre sus principales características esta la de utilizar en sus
Gratis teléfono fijo usando Google Voice y un RaspberryPi

Gratis teléfono fijo usando Google Voice y un RaspberryPi

descargo de responsabilidad: el siguiente artículo está destinado a los usuarios a gusto trabajando en máquinas Linux basada.En este artículo que analizaré los pasos que utiliza para configurar un teléfono fijo VoIP usando una interfaz SIP a través d
Un arco iris de fractales en Minecraft

Un arco iris de fractales en Minecraft

Hice un montón de scripts de Python para generar fractales coloridos en Minecraft. Para ejecutarlos con la versión de escritorio de Minecraft, necesita mi Mod de mermelada de frambuesa (también hay una versión para Android Pocket Edition), y muchos d
Experimentos análogos en cualquier

Experimentos análogos en cualquier

dos DIY microcontrolador basado en USB conectado unidades electrónicas que junto con el Texas Instruments analógico sistema Lab kit y un ordenador portátil, le permiten llevar a cabo experimentos analógicos en cualquier lugar.Sería maravillosos si se