转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515205

之前一直在考虑该不该写这篇,由于我之前在博客里有写过LED的驱动,可是没有具体的解说。后来本着叫大家都能看懂驱动的想法,我还是决定要写一下。我想通过LED的驱动,让不了解驱动的小伙伴。可以有一个感性的认识。

一.代码

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/device.h>
#include <mach/gpio.h>static struct class *wvm_led_class;
static  int major;volatile unsigned long *gpbcon = NULL;
volatile unsigned long *gpbdat = NULL;static int wvm_led_drv_open(struct inode *inode, struct file *file)
{/** LED1,LED2,LED4相应GPB5、GPB6、GPB7、GPB8*//* 配置GPB5,6,7,8为输出 */*gpbcon &= ~((0x3<<(5*2)) | (0x3<<(6*2)) | (0x3<<(7*2)) | (0x3<<(8*2)));*gpbcon |= ((0x1<<(5*2)) | (0x1<<(6*2)) | (0x1<<(7*2)) | (0x1<<(8*2)));return 0;
}static int wvm_led_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{int val,ret;ret=copy_from_user(&val, buf, count); //  copy_to_user();if (ret)return -EAGAIN;if (val == 1){// 点灯*gpbdat &= ~((1<<5) | (1<<6) | (1<<7) | (1<<8));}else{// 灭灯*gpbdat |= (1<<5) | (1<<6) | (1<<7) | (1<<8);}return 0;
}static struct file_operations wvm_led_drv_fops = {.owner  =   THIS_MODULE,    /* 这是一个宏,推向编译模块时自己主动创建的__this_module变量 */.open   =   wvm_led_drv_open,     .write  =  wvm_led_drv_write,
};static int wvm_led_drv_init(void)  //入口函数(做初始化,创建设备等工作)
{major = register_chrdev(0, "wvm_led_drv", &wvm_led_drv_fops); // 注冊, 告诉内核if(major < 0){printk(  " wvm_led_drv register falid!/n");return major;}wvm_led_class = class_create(THIS_MODULE, "wvm_led");if(IS_ERR(wvm_led_class)){printk( " wvm_led_drv register class falid!/n");return -1;}device_create(wvm_led_class, NULL, MKDEV(major, 0), NULL, "led"); /* /dev/led */gpbcon = (volatile unsigned long *)ioremap(0x56000010, 16);gpbdat = gpbcon + 1;return 0;
}static void wvm_led_drv_exit(void)  //出口函数(做卸载和销毁工作)
{unregister_chrdev(major, "wvm_led_drv"); // 卸载device_destroy(wvm_led_class, MKDEV(major, 0));class_destroy(wvm_led_class);iounmap(gpbcon);
}module_init(wvm_led_drv_init);  //定义入口函数
module_exit(wvm_led_drv_exit);  //定义出口函数MODULE_LICENSE("GPL");

二.驱动结构

正所谓麻雀虽小五脏俱全,它包含了一个驱动的基本功能。以下我写一个类似于模板的东西给大家。

//头文件

...

//定义一些变量和结构体等

...

//各种操作函数

xx_open()

{

.....

}

xx_close()

{

.....

}

xx_ioctl()

{

.....

}

...

//file_operations结构体

static struct file_operations XXX_drv_fops = {
        .owner   =  THIS_MODULE,    /* 这是一个宏。推向编译模块时自己主动创建的__this_module变量 */
        .open     =  XXX_open,           //后面的名字要与操作函数一致
        .close    =  XXX_close,

.ioctl       =  XXX_ioctl, 
  
};

//入口函数

static int XXX_init(void)

{

主要做创建设备等初始化工作。參照前面驱动(要推断返回值)。

}

//出口函数

static voidXXX_exit(void)

{

主要卸载创建的设备。做一些清理工作。參考前面的驱动去写

}

//入口、出口、证书的声明

module_init(XXX_init);
module_exit(XXX_exit);
MODULE_LICENSE("GPL");

三.应用測试

应用就是简单的測试一下开灯和关灯

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>/* led_test on    开灯* led_test off  关灯*/
int main(int argc, char **argv)
{int fd;int val = 1;fd = open("/dev/led", O_RDWR);if (fd < 0){printf("can't open!\n");}if (argc != 2){printf("Usage :\n");printf("%s <on|off>\n", argv[0]);return 0;}if (strcmp(argv[1], "on") == 0){val  = 1;}else{val = 0;}write(fd, &val, 4);return 0;
}

看到这也许有的小伙伴们已经买白了驱动怎么写,可是灯怎么亮的呢?

应用程序:write()----->驱动程序:write()

细心的小伙伴已经注意到驱动中的write()中有ret=copy_from_user(&val, buf, count);

然后就能够開始运行亮灯和灭灯了

两步搞定亮灭灯:

因为一个引脚可能同意有不同的功能,所以引脚的寄存器分为两类。一类为控制寄存器。一类数据寄存器

要操作某个引脚先设置控制寄存器(配置为某种功能)。然后设置数据寄存器(实现功能)

*gpbcon &= ~((0x3<<(5*2)) | (0x3<<(6*2)) | (0x3<<(7*2)) | (0x3<<(8*2)));  //清零
    *gpbcon |= ((0x1<<(5*2)) | (0x1<<(6*2)) | (0x1<<(7*2)) | (0x1<<(8*2)));     //配置为输出引脚

// 点灯
        *gpbdat &= ~((1<<5) | (1<<6) | (1<<7) | (1<<8));

// 灭灯
        *gpbdat |= (1<<5) | (1<<6) | (1<<7) | (1<<8);

这里面要注意一点,在曾经单片机敲代码的的时候我们能够直接操作物理地址,可是如今驱动要操作虚拟地址。

所以我们要做一个映射

gpbcon = (volatile unsigned long *)ioremap(0x56000010, 16);  //物理地址0x56000010 ,映射长度16字节

gpbdat = gpbcon + 1;

远程视频监控之驱动篇(LED)相关推荐

  1. 远程视频监控之驱动篇(摄像头)

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515279 一.linux摄像头驱动框架 二.UVC介绍 UVC是USB v ...

  2. 远程视频监控之应用篇(mjpg-streamer)

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515311 这篇文章将主要结合源码介绍mjpg-streamer,使小伙伴们 ...

  3. 远程视频监控之构思篇

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38462753 一.项目产生 这个项目的产生其实是个意外,因为我原本假期是像做一 ...

  4. 远程视频监控之应用篇(all_test)

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515343 这将是本项目的最后一篇,实现监控报警功能,可能还有改进的地方,我 ...

  5. 远程视频监控:流媒体之FFmpeg+RTMP+Nginx+VLC

    一:概述 在本项目开篇中已经提及了远程视频监控的两种的方案,而在上一篇也已经介绍了MJPG-Streamer方案, 远程视频监控:MJPG-Streamer_猩猩の點燈的博客-CSDN博客_mjpg- ...

  6. i.MX6ULL - 远程视频监控方案实现(nginx-rtmp流媒体服务器、ffmpeg推流)

    i.MX6ULL - 远程视频监控配置(nginx-rtmp流媒体服务器.ffmpeg推流) 目录 i.MX6ULL - 远程视频监控配置(nginx-rtmp流媒体服务器.ffmpeg推流) 1.前 ...

  7. FFmpeg的远程视频监控系统编解码

    FFmpeg的远程视频监控系统编解码 2013-05-07 22:29:32|  分类: 默认分类|举报|字号 订阅 FFmpeg的远程视频监控系统编解码 FFmpeg的远程视频监控系统编解码 ? 0 ...

  8. 基于FFmpeg的远程视频监控系统编解码

    摘要:在远程视频监控系统中视频数据的编码传输以及解码显示是一个重要组成部分,通过对FFmpeg的研究学习,考虑采用FFmpeg来实现编解码的方法.远程监控系统由采集发送端和接收处理端组成,采集发送端使 ...

  9. 利用 Red5 , RTMP协议建立远程视频监控系统一

    最近做了一个远程视频监控系统, 要求同时显示可见光和红外线两个路视频. 这里想和大家分享一些技术和经验, 采集软件实现 1编码:视频帧压缩编码用H.264格式. 2根据通讯网络质量设置码率. 3视频传 ...

最新文章

  1. C语言实现十大经典排序算法
  2. VS2013常用快捷方式
  3. C语言循环队列的实现方法,C语言循环队列(数组实现)
  4. 对象内存布局 (5)
  5. r roc函数_画ROC曲线的R包总结
  6. matlab遗传算法实例crtrp,遗传算法求解实例
  7. 一位网络工程师的终告
  8. ASP.NET——上传文件超过了最大请求长度
  9. WebRTC下载及编译(二)
  10. 生成pdf设置中文字体出错 \simsun.ttc' with 'Identity-H' is not recognized或者type of font{0} is not recognized
  11. MRI脑影像分析从哲学到技术:一文搞懂VBM预处理基本原理(全网最详细解析)
  12. java ssm进销存源码,ssm进销存流程管理系统
  13. AssertionError: CUDA unavailable, invalid device 0 requested
  14. 一些有关MATLAB使用的基础习题
  15. 统计学基础知识(三)
  16. 【数据结构】查找算法
  17. JavaScript常用技巧:stroage封装
  18. Discuz!论坛出现附件问题的解决方案
  19. 自定义圆形ImageView(仿QQ头像)
  20. windows环境elasticsearch设置登录用户名、密码

热门文章

  1. Spring MVC 中使用AOP 进行统一日志管理--XML配置实现
  2. saltstack 模型与认证通信原理
  3. Bzoj4542--Hnoi2016大数
  4. 【洛谷P1282】多米诺骨牌
  5. Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
  6. JPA+Hibernate 3.3 ——第一个JPA程序
  7. idea查看git分支快捷键_开发常用Git/Linux/idea命令快捷键总结(持续更新)
  8. java 并发queue_深入浅出 Java Concurrency (19): 并发容器 part 4 并发队列与Queue简介
  9. group python 读hdf5_Python处理Excel模块的对比分析
  10. 智慧城市java开发_智慧城市主界面开发 使用eclipse开发智慧城市APP源码 - 下载 - 搜珍网...