基于Dragonboard 410c的燃气烟雾检测器(四)

本文介绍了一种用于嵌入式系统的红灯报警模块驱动程序的实现方法,该驱动支持通过sysfs接口进行交互,便于上层软件进行状态设置与获取。

  前面已经简单的将燃气烟雾检测模块MQ-2和温湿度检测模块dht11的底层驱动实现了,下面再加一个简单的红灯的驱动,用于报警:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/sysfs.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/err.h>
#include <linux/input.h>
#include <linux/mutex.h>
#include <linux/ctype.h>
#include <linux/pm_runtime.h>
#include <linux/device.h>
#include <linux/irq.h>
#include <linux/of_gpio.h>
 
#include <linux/wait.h>
#include <asm/uaccess.h>  
 
struct red_data{
    int pin;    
    int d;
    struct mutex data_lock;
};
 
static int parse_dt(struct platform_device* pdev,struct red_data* data){
    int rc;
    struct device_node* node = pdev->dev.of_node;
    data->pin = of_get_named_gpio(node,"thunder,pin",0);
    if(gpio_is_valid(data->pin)){
        rc = gpio_request(data->pin,"red_pin");
        if(rc < 0){
            pr_err("Unable to request pin gpio\n");
        }
        gpio_direction_output(data->pin, 1);
        data->d = 1;
    }
    return 0;
}
 
static ssize_t red_store_value(struct device *dev,                                                                                                                                                   
                struct device_attribute *attr,
                const char *buf, size_t size){
    struct red_data* data = dev_get_drvdata(dev);
    int da = simple_strtoul(buf,NULL,10);
    if(da == 1){
        gpio_set_value(data->pin, 1);
    }else{
        gpio_set_value(data->pin, 0);
    }
    data->d = da;
    return size;
}
 
static ssize_t red_show_value(struct device *dev,
                                  struct device_attribute* attr,char* buf){
    struct red_data* data = dev_get_drvdata(dev);
    ssize_t da;
    mutex_lock(&data->data_lock);
    da = sprintf(buf, "%d\n", data->d);
    mutex_unlock(&data->data_lock);
    return da;
}
 
static DEVICE_ATTR(value,0644,red_show_value,red_store_value);
 
static int red_probe(struct platform_device *pdev){
    struct red_data* data;
    int result;
    data = kmalloc(sizeof(struct red_data),GFP_KERNEL);
    if(!data){
        pr_err("%s kmalloc error\n",__FUNCTION__);
        return -ENOMEM;   
    }
    dev_set_drvdata(&pdev->dev,data);
    result = parse_dt(pdev,data);
    if(result<0){
        pr_err("%s error when parse dt\n",__FUNCTION__);
        result = -EINVAL;
        goto err_parse_dt;
    }
 
    mutex_init(&data->data_lock);
    
    result=sysfs_create_file(&pdev->dev.kobj,&dev_attr_value.attr);
    printk("red probe success\n");
    return 0;
err_parse_dt:
    kfree(data);
    printk("red probe failed\n");
    return result;
}
static int red_remove(struct platform_device *pdev){
    return 0;
}
 
 
static struct of_device_id red_match_table[] = {
    { .compatible = "thunder,red",},
    { },
};
 
 
 
static struct platform_driver red_driver = {
    .probe = red_probe,
    .remove = red_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = "red",
        .of_match_table = red_match_table,
    },
};
 
 
module_platform_driver(red_driver);
MODULE_AUTHOR("RED");
MODULE_LICENSE("GPL v2");


节点路径:/sys/bus/platform/drivers/red/rgb_red.64/value

这个节点是可读可写的,当节点值为0,灯亮报警;当节点值为1等灭,正常。

到此大部分底层需要的驱动都准备好了,节点也都有了,接下来就是向上走,大致流程:driver->hal->jni->app


先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值