三星6818基于linux内核中断开发火情报警

  • 编写驱动代码
  • 编写应用程序
  • 编译驱动模块、程序下载到开发板

编写驱动代码

  1. 附上代码
#define GEC6818_fire_STA     _IOR('K',  1, unsigned long)
//ioctl命令宏的定义,可参考上一篇超声波驱动学习ioctl//定义一个等待的条件,中断函数中要用到标志位
static int fire_press_flag = 0;//定义一个等待队列,进程访问等待队列的时候,判断等待条件,条件满足,进程继续执行,条件不满足,进程就产生阻塞,进入睡眠状态,睡眠状态有两种。
static wait_queue_head_t gec6818_fire_wq;struct csb_gpio_info{unsigned int gpio_ID;unsigned char* gpio_flag;
};//gpio函数要用的参数结构体static struct csb_gpio_info gpio_info[2]={//给结构体赋值
{PAD_GPIO_C+14,//这个参数要参考kernel里面的代码,每个芯片都不一样"gpioc_14"//这个就什么只是一个标记而已
},
{PAD_GPIO_C+8,"gpioc_8"
}
};
//定义中断服务程序
/*中断服务程序
注意问题:裸机:中断服务程序是没有返回值和参数的。linux:中断服务程序是底层的中断处理过程调用的函数,所以有参数和返回值。
irqreturn_t (*irq_handler_t)(int irq, void *dev);
参数说明:int irq ----> 中断号void *dev --->申请中断的时候,传递的参数
*/
irqreturn_t fire_irq_handler(int irq, void *dev)
{int rt_val;if(irq == (IRQ_GPIO_C_START + 8)){rt_val = gpio_get_value(gpio_info[1].gpio_ID);//驱动标准GPIO函数接口可参考上一篇超声波驱动学习使用if(rt_val==0){gpio_set_value(gpio_info[0].gpio_ID,0);}else {gpio_set_value(gpio_info[0].gpio_ID,1);}//设置等待条件为真,真就是1fire_press_flag=1;//唤醒等待队列中的进程,唤醒后就不会在wait_event_interruptible函数阻塞了wake_up(&gec6818_fire_wq);}return IRQ_HANDLED;//---->中断处理结束,正常返回,这是内核代码中定义中断成功返回的宏
}   static int  gec6818_fire_open (struct inode * inode, struct file *file)
{//配置GPIOC8为输入模式gpio_direction_input(gpio_info[1].gpio_ID);//使用标准gpio接口配置GPIO为输出模式//配置GPIOC7为输出模式gpio_direction_output(gpio_info[0].gpio_ID,0);//使用标准gpio接口配置GPIO为输入模式printk("gec6818_csb_open \n");return 0;
}
static int  gec6818_fire_release (struct inode * inode, struct file *file)
{printk("gec6818_csb_release \n");return 0;
}
static long gec6818_fire_ioctl (struct file *filp, unsigned int cmd, unsigned long args)
//这个函数参考上一篇超声波驱动
{int rt,fire_val;printk("here \n");switch (cmd) {case GEC6818_fire_STA:{//访问等待队列,判断key_press_flag条件是否真,队列有两种:可中断睡眠、不可中断睡眠//当fire_press_flag为真才去访问队列(队列没被释放这里会一直睡眠堵塞)wait_event_interruptible(gec6818_fire_wq,fire_press_flag);fire_press_flag=0;fire_val=1;}break;}rt = copy_to_user((void *)args,&fire_val,4);//这个函数参考上一篇超声波if(rt!=0){return -EFAULT;}return 0;
}static struct file_operations fire_fops = {//这是驱动文件的文件集机构体.owner      = THIS_MODULE,.open        = gec6818_fire_open,.release            = gec6818_fire_release,.unlocked_ioctl     = gec6818_fire_ioctl,
};static struct miscdevice s3c_adc_miscdev = {//混杂设备属性的结构体.minor       = MISC_DYNAMIC_MINOR,  //指定了ADC的次设备号为131,也可以MISC_DYNAMIC_MINOR,动态分配次设备号.name        = "fire",        //设备名称,/dev/adc.fops        = &fire_fops,//文件操作集
};static int __init fire_drv_init(void){//这个是驱动程序入口函数类似于Main不过驱动入口要声明,参考函数module_init()int rt,var;rt = misc_register(&s3c_adc_miscdev);//这里初始化混杂设备if (rt!=0) {printk(KERN_ERR "cannot register miscdev on minor=%d (%d)\n",MISC_DYNAMIC_MINOR, rt);goto err_clk;}for (var = 0; var < 2; ++var) {//为了防止gpio驱动有冲突先释放gpio_free(gpio_info[var].gpio_ID);}for (var = 0; var < 2; ++var) {rt=gpio_request(gpio_info[var].gpio_ID,gpio_info[var].gpio_flag);//申请GPIO驱动if(rt < 0){printk("gpio_request:%s fail\n",gpio_info[var].gpio_flag);goto gpio_request_fail;}}
//申请中断
/*request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
参数说明:unsigned int irq        中断号,每个中断源有一个唯一的中断号(每个芯片的定义不一样)irq_handler_t handler    中断服务程序,中断响应的时候,执行的函数。unsigned long flags      中断的标志,外部中断:触发方式#define IRQF_TRIGGER_RISING        0x00000001      上升沿触发#define IRQF_TRIGGER_FALLING   0x00000002      下降沿触发#define IRQF_TRIGGER_HIGH      0x00000004#define IRQF_TRIGGER_LOW      0x00000008const char *name          中断的名称,自定义void *dev               向中断服务程序发送的参数
返回值:成功,返回0;失败,返回复数的错误码。*/rt= request_irq(IRQ_GPIO_C_START+8,fire_irq_handler,IRQF_TRIGGER_RISING||IRQF_TRIGGER_FALLING,"gpioc_8",NULL);if(rt < 0){printk("request_irq fail \n");goto request_irq_fail;}//初始化等待队列init_waitqueue_head(&gec6818_fire_wq);printk("gec6818 csb init\n");return 0;request_irq_fail:free_irq(IRQ_GPIO_C_START+8,NULL);//记得失败要释放中断gpio_request_fail:for (var = 0; var < 2; ++var) {gpio_free(gpio_info[var].gpio_ID);}
err_clk:misc_deregister(&s3c_adc_miscdev);//注销混杂设备return rt;
}
//***************************************************************
static void __exit fire_drv_register(void){int var;free_irq(IRQ_GPIO_C_START+8,NULL);for (var = 0; var < 2; ++var) {gpio_free(gpio_info[var].gpio_ID);}misc_register(&s3c_adc_miscdev);//注销混杂设备
}//驱动程序的入口:insmod led_drv.ko调用module_init,module_init又会去调用gec6818_key_init。
module_init(fire_drv_init);//驱动程序的出口:rmsmod led_drv调用module_exit,module_exit又会去调用gec6818_key_exit。
module_exit(fire_drv_register);//模块描述
MODULE_AUTHOR("stephenwen88@163.com");           //作者信息
MODULE_DESCRIPTION("gec6818 fire driver");        //模块功能说明
MODULE_LICENSE("GPL");                    //许可证:驱动遵循GPL协议,这个必须加,否则会导致驱动异常

编写应用程序

#define GEC6818_fire_STA     _IOR('K',  1, unsigned long)
//这个ioctl命令宏定义参考上一篇超声波驱动int main(int argc, char **argv)
{int fire_fd;int rt=0;int fire_val;//打开fire设备fire_fd = open("/dev/fire",O_RDWR);//fire设备名字在驱动申请驱动有定义if(fire_fd < 0){perror("open /dev/gec6818_fire:fail \n");return fire_fd;}while(1){//读取按键的状态rt = ioctl(fire_fd,GEC6818_fire_STA,&fire_val);if(rt == 0){printf("fire_val =%d\n",fire_val);}printf("now run to next read key proceess\n");usleep(1000*500);}close(fire_fd);return 0;
}

编译驱动模块、程序下载到开发板

这里就不重复阐述了,参考

三星6818芯片火焰报警器驱动的编写相关推荐

  1. 和12岁小同志搞创客开发:手撕代码,做一款火焰报警器

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  2. Ardino基础教程 15_火焰报警器

    实验十五:火焰报警器 认识火焰传感器 火焰传感器(即红外接收三极管)是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏.实物如图: 火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收 ...

  3. PX4原生固件SPI驱动动编写与IMU传感器替换

    适用于PX4原生固件 核心目标:完成XSENS的MTI3,IMU替换.MTI3是一款航姿参考系统,可以独立的输出四元数,加速度,磁力计等,角速度等航姿信息.里面有完整的卡尔曼滤波,可以替换飞控本身里面 ...

  4. 基于51单片机的火焰报警器

    基于51单片机的火焰报警器 一.模块描述 1.可以检测火焰或者波长在760纳米心1100纳米范围内的光源 2.探测角度60度左右,对火焰光谱特别灵敏3灵敏度可调(图中蓝色数字电位器调节) 3.对火焰的 ...

  5. 【Arduino】入门篇——火焰报警器

    火焰报警器 一.实验目的 二.实验材料 三.电路图 四.实验步骤 五.代码块 六.实验结果 一.实验目的 火焰传感器(即红外接收三极管)是一种对火焰特别敏感的传感器.其利用红外线对火焰的敏感特性,用特 ...

  6. 具体芯片的I2C_Adapter驱动分析

    具体芯片的I2C_Adapter驱动分析 文章目录 具体芯片的I2C_Adapter驱动分析 参考资料: 一. I2C控制器内部结构 1.1 通用的简化结构 1.2 IMX6ULL的I2C控制器内部结 ...

  7. 逆变器方案(高频/工频)正弦波逆变器驱动板,兼容EG8010主芯片的EGS002驱动板,单极性交替驱动,解决单边发热需要全波整流采样

    逆变器方案(高频/工频)正弦波逆变器驱动板,兼容EG8010主芯片的EGS002驱动板,单极性交替驱动,解决单边发热需要全波整流采样,两个半桥能量不均匀导致的性能不稳定:可选单极性基波调制,兼容高频机 ...

  8. 基于arduino的火焰报警器(包含Proteus仿真)

    火焰报警器所需要的器件有:Arduino UNO,光敏电阻传感器模块,温度传感器,蜂鸣器,LED灯.其原理是当温度,亮度达到一定限度时,使得LED发光,蜂鸣器报警. 由于Proteus中没有三线制的光 ...

  9. 三星 linux 电视软件下载中心,三星 SF-565P 多功能一体机驱动下载(ver.1.0.156) 版For Linux...

    三星 SF-565P 多功能一体机驱动下载(ver.1.0.156) 版For Linux (2012-07-11 16:09:05) 标签: 12.04 ubuntu 三星 打印机 驱动 it 这是 ...

  10. Arduino小工具之火焰报警器

    这是我写的第一篇博客,话不多说这个是基于Arduino的火焰报警器,能实现感应到火焰就进行声音播放及亮灯. 工具准备 uno开发板 与uno配套USB数据线 无源蜂鸣器 RGB灯 火焰传感器 电阻 工 ...

最新文章

  1. 手把手搭建企业IT实战环境第三季:快速搭建SCCM1902服务器
  2. python冒泡排序函数_python冒泡排序-Python,冒泡排序
  3. VS2012 颜色配置成黑色
  4. android 侧滑删除功能,200行代码让你在Android中完美实现iOS版侧滑删除效果
  5. .Net 安装aliyun-oss
  6. python电子病历交接班系统_专科电子病历
  7. ES6——rest参数
  8. 官宣!阿里进军 5G,成立 XG 实验室发力新基建
  9. 关于编写过程中进制之间的转换
  10. jsp内置对象(三)-----response对象
  11. python怎么把数据导入excel_如何把python中的数据导入excel
  12. 点餐app的初步总结
  13. 制作U盘启动盘(无广告)
  14. rip路由的 负载分担
  15. linux关闭wps画布进程,在Deepin系统下安装WPS后一直出现一个无响应的wpsoffice进程...
  16. 抗体偶联药物 (ADC)——抗肿瘤细胞
  17. ABBYY PDF Transformer+ Pro可以支持189种语言
  18. 学会了30个安慰自己和别人的技巧,你会更快乐
  19. 【无标题】java求等腰梯形面积
  20. Redis 做接口限流

热门文章

  1. 在线视频播放加速方法
  2. Effective HPA:预测未来的弹性伸缩产品
  3. 快恢复二极管工作原理、反向恢复时间详解
  4. 性能工具之 Locust 工具关联与参数化
  5. unity检测范围内敌人_Unity判断周围是否有敌人
  6. uni-app 文件下载
  7. 自行委托的鉴定意见可以作为审理依据
  8. 设计模式——备份模式
  9. 【电脑技术】修改无线网卡MAC地址失败的原因
  10. win7系统提示此windows副本不是正版怎么办?