您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 树莓派驱动学习-字符设备驱动(LED)
从上次helloworld程序中,我们已经搭建好了驱动学习相关的环境搭建,为接下来的设备驱动做好了准备。同时通过最简单的helloworld程序,学习了模块的初始化和退出,知道了如何编写***_init和***_exit函数,知道了如何通过内核打印函数printk输出相关信息。Linux中的设备驱动分三大类:字符设备、块设备、网络设备。本篇文章讨论字符型设备程序如何编写,通过简单的LED驱动程序介绍相关知识。下篇文章介绍杂项设备(misc)驱动程序的编写,这在实际项目中很常用,相当于字符设备的简化版。首先附上完整程序:[plain]viewplaincopy1./preprename=codeclass=plain/*********************************************************************************************2.*File:led_driver.c3.*Author:FawenXu4.*Desc:leddrivercode5.*History:May9th20156.*********************************************************************************************/7.#includelinux/errno.h8.#includelinux/kernel.h9.#includelinux/module.h10.#includelinux/slab.h11.#includelinux/input.h12.#includelinux/init.h13.#includelinux/serio.h14.#includelinux/delay.h15.#includelinux/clk.h16.#includelinux/miscdevice.h17.#includelinux/gpio.h18.#includeasm/io.h19.#includeasm/irq.h20.#includeasm/uaccess.h21.#includelinux/cdev.h22.23.MODULE_AUTHOR(FawenXu);24.MODULE_LICENSE(DualBSD/GPL);25.26.staticunsignedintled_major=0;27.staticunsignedintbcm2835_gpio_baseaddr;28.29.module_param(led_major,int,0);30.31.#defineLED_MAGIC'k'32.#defineLED_ON_CMD_IO(LED_MAGIC,1)33.#defineLED_OFF_CMD_IO(LED_MAGIC,2)34.35.//#defineBCM2835_PERI_BASE0x2000000036.//#defineBCM2835_PERI_BASE0x7e00000037.#defineBCM2835_GPIO_BASE0x2020000038.#defineBCM2835_GPIOReg_GPFSEL00x0000000039.#defineBCM2835_GPIOReg_GPSET00x0000001c40.#defineBCM2835_GPIOReg_GPCLR00x0000002841.#defineBCM2835_GPIO_FSEL_INP0x0000000042.#defineBCM2835_GPIO_FSEL_OUTP0x0000000143.#defineRPI_BPLUS_GPIO_J8_121844.45.intbcm2835_gpio_fsel(intpin,intmode)46.{47.volatileintshift,value;48.volatileint*bcm2835_gpio_fsel_addrp=bcm2835_gpio_baseaddr+(pin/10)*4;49.//printk(Inbcm2835_gpio_fselfunction:\n);50.//printk(pin=%d,(pin/10)*4=%d,pin,(pin/10)*4);51.//printk(bcm2835_gpio_baseaddr=0x%x\n,bcm2835_gpio_baseaddr);52.//printk(bcm2835_gpio_fsel_addrp=0x%p\n,bcm2835_gpio_fsel_addrp);53.54.shift=(pin%10)*3;55.value=modeshift;56.//printk(shift=%d,value=0x%x\n,shift,value);57.//printk(bcm2835_gpio_fseladdr0x%p:0x%x\n,bcm2835_gpio_fsel_addrp,*bcm2835_gpio_fsel_addrp);58.(*bcm2835_gpio_fsel_addrp)=(*bcm2835_gpio_fsel_addrp)|value;59.//printk(bcm2835_gpio_fseladdr0x%p:0x%x\n,bcm2835_gpio_fsel_addrp,*bcm2835_gpio_fsel_addrp);60.return0;61.}62.intbcm2835_gpio_set(intpin)63.{64.volatileintshift,value;65.volatileint*bcm2835_gpio_set_addrp=bcm2835_gpio_baseaddr+BCM2835_GPIOReg_GPSET0+(pin/32)*4;66.//printk(Inbcm2835_gpio_setfunction:\n);67.//printk(bcm2835_gpio_baseaddr=0x%x\n,bcm2835_gpio_baseaddr);68.//printk(bcm2835_gpio_set_addrp=0x%p\n,bcm2835_gpio_set_addrp);69.70.shift=pin%32;71.value=1shift;72.//printk(shift=%d,value=0x%x\n,shift,value);73.//printk(bcm2835_gpio_setaddr0x%p:0x%x\n,bcm2835_gpio_set_addrp,*bcm2835_gpio_set_addrp);74.(*bcm2835_gpio_set_addrp)=(*bcm2835_gpio_set_addrp)|value;75.//printk(bcm2835_gpio_setaddr0x%p:0x%x\n,bcm2835_gpio_set_addrp,*bcm2835_gpio_set_addrp);76.return0;77.}78.intbcm2835_gpio_set_release(intpin)79.{80.volatileintshift,value;81.volatileint*bcm2835_gpio_set_release_addrp=bcm2835_gpio_baseaddr+BCM2835_GPIOReg_GPSET0+(pin/32)*4;82.//printk(Inbcm2835_gpio_set_releasefunction:\n);83.//printk(bcm2835_gpio_baseaddr=0x%x\n,bcm2835_gpio_baseaddr);84.//printk(bcm2835_gpio_set_release_addrp=0x%p\n,bcm2835_gpio_set_release_addrp);85.86.shift=pin%32;87.value=~(1shift);88.89.//printk(shift=%d,value=0x%x\n,shift,value);90.//printk(bcm2835_gpio_set_releaseaddr0x%p:0x%x\n,bcm2835_gpio_set_release_addrp,*bcm2835_gpio_set_release_addrp);91.(*bcm2835_gpio_set_release_addrp)=(*bcm2835_gpio_set_release_addrp)&value;92.//printk(bcm2835_gpio_set_releaseaddr0x%p:0x%x\n,bcm2835_gpio_set_release_addrp,*bcm2835_gpio_set_release_addrp);93.return0;94.}95.intbcm2835_gpio_clr(intpin)96.{97.volatileintshift,value;98.volatileint*bcm2835_gpio_clr_addrp=bcm2835_gpio_baseaddr+BCM2835_GPIOReg_GPCLR0+(pin/32)*4;99.//printk(Inbcm2835_gpio_clrfunction:\n);100.//printk(bcm2835_gpio_baseaddr=0x%x\n,bcm2835_gpio_baseaddr);101.//printk(bcm2835_gpio_clr_addrp=0x%p\n,bcm2835_gpio_clr_addrp);102.103.shift=pin%32;104.value=1shift;105.//printk(shift=%d,value=0x%x\n,shift,value);106.//printk(bcm2835_gpio_clraddr0x%p:0x%x\n,bcm2835_gpio_clr_addrp,*bcm2835_gpio_clr_addrp);107.(*bcm2835_gpio_clr_addrp)=(*bcm2835_gpio_clr_addrp)|value;108.//printk(bcm2835_gpio_clraddr0x%p:0x%x\n,bcm2835_gpio_clr_addrp,*bcm2835_gpio_clr_addrp);109.return0;110.}111.intbcm2835_gpio_clr_release(intpin)112.{113.volatileintshift,value;114.volatileint*bcm2835_gpio_clr_release_addrp=bcm2835_gpio_baseaddr+BCM2835_GPIOReg_GPCLR0+(pin/32)*4;115.//printk(Inbcm2835_gpio_clr_releasefunction:\n);116.//printk(bcm2835_gpio_baseaddr=0x%x\n,bcm2835_gpio_baseaddr);117.//printk(bcm2835_gpio_clr_release_addrp=0x%p\n,bcm2835_gpio_clr_release_addrp);118.119.shift=pin%32;120.value=~(1shift);121.//printk(shift=%d,value=0x%x\n,shift,value);122.//printk(bcm2835_gpio_clr_releaseaddr0x%p:0x%x\n,bcm2835_gpio_clr_release_a
本文标题:树莓派驱动学习-字符设备驱动(LED)
链接地址:https://www.777doc.com/doc-5082123 .html