远程视频监控之驱动篇(LED)

标签: 视频 监控 led | 发表时间:2014-08-14 02:08 | 作者:u013584315
出处:http://blog.csdn.net

转载请注明出处: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;


作者:u013584315 发表于2014-8-13 18:08:58 原文链接
阅读:7 评论:0 查看评论

相关 [视频 监控 led] 推荐:

远程视频监控之驱动篇(LED)

- - CSDN博客推荐文章
转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515205        .        之前一直在考虑该不该写这篇,因为我之前在博客里有写过LED的驱动,但是没有详细的讲解. 后来本着叫大家都能看懂驱动的想法,我还是决定要写一下.

LED手电筒门把手

- Suave - 设计|生活|发现新鲜
停电的时候你能准确无误的找到你家大门吗. 就算你找得到大门,敢问你又能否准确的插入钥匙打开大门呢. 十有八九就该掏出手机当手电用了吧. 设计师Kun-hee Kim估计住的地方常常停电,所以设计了这款带LED的门把手. 这LED灯采用光照感应,天黑的时候自然亮起为你照明. 而且门把手可以卸下来当手电筒使用哦.

卖萌的大号LED灯

- camus - 果壳网 guokr.com - 果壳网
DIYer:guyfrom7up 制作时间:一星期 制作难度:★★★★☆ GEEK指数:★★★★☆. 这是一个手工制作的普通10mmLED的10倍放大版本,包含3个1W功率的LED,由树脂浇注而成. 它还包括一个脉冲宽度调制(PWM)调光电路. 我从制作LED的木制模型开始;使用硅胶翻模制作出浇注的模具;最后在硅胶模具中浇注树脂.

双通道LED小台灯

- 宏劼 - 果壳网 guokr.com - 果壳网
DIYer:fu80 制作时间:一周 制作难度:★★★★☆ GEEK指数:★★★★☆. 在果壳小组信誓旦旦说要做台灯很久了,一直没有兑现诺言,这次正好更新台灯,就顺便填坑了. 这次的构思是用PCB板做骨架和外罩形体,可以很方便的加工,而且足够坚固. 整个台灯由3个板块组成,左上方是一个灯泡状的PCB板灯头,中间开孔,6只5050白光高亮贴片LED沿圆周均匀分布,同时焊点部分外延铺铜铺满整个正面,好处有以下几点:1,散热,可以把5050LED的热量迅速导出,防止热量过高损坏LED;2,铜箔面全部镀锡,正好是一个比较不错的镜面,可以反射一些杂散光往下,降低亮度的损耗.

ZoneMinder 1.25 发布,视频监控系统

- 迎客松 - LinuxEden开源社区-Linux伊甸园
ZoneMinder的作者是因為家中的車庫被竊,因而產生設計監控保全的念頭. ZoneMinder使用了Linux Server,PHP,MySQL加上幾支攝影機,就可以使用web介面監控重要場所. 當異常事件發生時,你就可以收到e-mail或簡訊通知. 阅读全文 | 邮件推荐 | 评论回复.

视频监控P2P解决方案

- -
本文分析了日益增长的民用级别家庭和个人网络视频监控市场的需求特点,并给出了一种经济可行易于大规模部署的P2P解决方案. 由于篇幅有限,本文只给出了方案的思路,未对更深入的技术细节做详细的论述,有兴趣的朋友可以继续深入研究. 网络视频监控市场持续火爆升温,除了公共安全市场持续高速增长之外,民用市场中家庭和个人视频监控的需求近年也在逐渐增多.

在树莓派上用python控制LED

- - 极客范 - GeekFan.net
初步学习RPi.GPIO模块的过程中写了一个控制8个LED的模块,基本上只是一个对RPi.GPIO的一个封装. 一个已经安装配置好了的树莓派. 连接控制树莓派所用的其他必须设备. 按照电路图所示,在面包板上进行连接. 首先得确定RPi.GPIO已安装. 最新的系统已经自带了,如果没有的可以使用命令.

用 Google+ Hangouts 山寨一个家庭视频监控系统

- Alimoe - 谷奥——探寻谷歌的奥秘
Delerium又发现了Google+ Hangouts视频群聊功能的一个用途:山寨型家庭视频监控系统. 其实用iOS设备的Facetime也可以实现,不过Google+ Hangouts更简单. 你只需要注册两个Google+帐户,二者同时加到一个私密的Hangouts群组里,就可以互相监控了,可以一台电脑在办公室,另外一台在家里,随时监控那边的情况.

基于android的远程视频监控系统——实现,

- - 博客园_首页
本帖仅献给和我一样热爱 Android开发,并渴望学习的朋友们. 现在我将分享我的学习过程,希望大家通过学习也能够独立完成这个简单的系统. (PS.这个系统是我在学习java和android一个月的时间内鼓捣出来的,所以没有基础的朋友也不要担心. 如标题所述,今天我们将学习如何打开摄像头,并在屏幕上预览图像.

视频监控公司 Dropcam 获3000万美元投资

- - TECH2IPO创见
Dropcam 日前宣布获得3000万美元 C 轮投资,Institutional Venture Partners 领投,凯鹏华盈、Menlo Ventures 和 Accel Partners 跟投. Dropcam 提供的移动摄像头产品 Dropcam HD 可借助 WI-FI 网络录制实时视频,并通过移动端应用即时了解被监控的地方正在发生的事情.