基于DragonBoard 410c的自动浇花机(二)

原创 2018年02月01日 13:44:58

     在http://blog.csdn.net/weixin_40109283/article/details/79227038博客中已经介绍了基于DragonBoard 410c的自动浇花机的硬件设计,接下来介绍一下软件设计。

代码如下所示:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sysfs.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/err.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <asm/uaccess.h>
#include <linux/kdev_t.h>
#include <linux/slab.h>
#include <linux/timer.h>
#include <linux/jiffies.h>

struct water_pdata {
    struct platform_device *pdev;
    int machine_gpio;
    int humidity_gpio1;
    int humidity_gpio2;
    int humidity_gpio3;
    int irq;
    
    struct timer_list watertime;
};

struct water_pdata* pdata;

static void water_flowers_func(unsigned long data)
{
    int a, b, c;

    printk(KERN_INFO "water_flowesr_func enter\n");
    a = gpio_get_value(pdata->humidity_gpio1);
    printk("humidity gpio1 = %d.\n", a);    
    b = gpio_get_value(pdata->humidity_gpio2);    
    printk("humidity gpio2 = %d.\n", b);    
    c = gpio_get_value(pdata->humidity_gpio3);    
    printk("humidity gpio3 = %d.\n", c);    

    if (a+b+c >= 2) {
        gpio_set_value(pdata->machine_gpio, 1);
        printk("watering flowers!\n");
    }
    else {
        gpio_set_value(pdata->machine_gpio, 0);
        printk("Not water flowers.\n");
    }
    mod_timer(&(pdata->watertime), jiffies + HZ);
}

static int water_probe(struct platform_device *pdev)
{
    int result;
    struct device_node* node = pdev->dev.of_node;
    
    printk("water probe enter\n");
    pdata = devm_kzalloc(&pdev->dev, sizeof(pdata), GFP_KERNEL);
    if (!pdata) {
        pr_err("%s kzalloc error\n", __FUNCTION__);
        return -ENOMEM;
    }

    dev_set_drvdata(&pdev->dev, pdata);
    pdata->humidity_gpio1 = of_get_named_gpio(node, "thundersoft,humidity_gpio1", 0);
    if (!gpio_is_valid(pdata->humidity_gpio1)) {
        pr_err("humidity gpio1 not specified\n");
        goto err1;
    } else {
        result = gpio_request(pdata->humidity_gpio1, "humidity_gpio1");
        if (result < 0) {
            pr_err("Unable to request humidity gpio1\n");
            goto err1;
        } else {
            gpio_direction_input(pdata->humidity_gpio1);
        }
    }
    pdata->humidity_gpio2 = of_get_named_gpio(node, "thundersoft,humidity_gpio2", 0);
    if (!gpio_is_valid(pdata->humidity_gpio2)) {
        pr_err("humidity gpio2 not specified\n");
        goto err2;
    } else {
        result = gpio_request(pdata->humidity_gpio2, "humidity_gpio2");
        if (result < 0) {
            pr_err("Unable to request humidity gpio2\n");
            goto err2;
        } else {
            gpio_direction_input(pdata->humidity_gpio2);
        }
    }
    pdata->humidity_gpio3 = of_get_named_gpio(node, "thundersoft,humidity_gpio3", 0);
    if (!gpio_is_valid(pdata->humidity_gpio3)) {
        pr_err("humidity gpio3 not specified\n");
        goto err3;
    } else {
        result = gpio_request(pdata->humidity_gpio3, "humidity_gpio3");
        if (result < 0) {
            pr_err("Unable to request humidity gpio3\n");
            goto err3;
        } else {
            gpio_direction_input(pdata->humidity_gpio3);
        }
    }

    pdata->machine_gpio = of_get_named_gpio(node, "thundersoft,machine_gpio", 0);
    if (!gpio_is_valid(pdata->machine_gpio)) {
        pr_err("machine gpio not secified\n");
        goto err4;
    } else {
        result = gpio_request(pdata->machine_gpio, "machine_gpio");
        if (result < 0) {
            pr_err("Unable to request machine gpio\n");
            goto err4;
        } else {
            gpio_direction_output(pdata->machine_gpio, 0);
        }
    }

    setup_timer(&(pdata->watertime), water_flowers_func, (unsigned long)pdata);
    pdata->watertime.expires = jiffies + HZ;
    add_timer(&(pdata->watertime));

    printk(KERN_INFO "water probe success\n");
    return 0;

err4:
    gpio_free(pdata->humidity_gpio3);
err3:
    gpio_free(pdata->humidity_gpio2);
err2:
    gpio_free(pdata->humidity_gpio1);
err1:
    kfree(pdata);
    printk(KERN_ERR "water probe failed\n");
    return -EINVAL;
}

static int water_remove(struct platform_device *pdev)
{
    gpio_free(pdata->machine_gpio);
    gpio_free(pdata->humidity_gpio3);
    gpio_free(pdata->humidity_gpio2);
    gpio_free(pdata->humidity_gpio1);
    del_timer(&(pdata->watertime));
    kfree(pdata);
    
    return 0;
}

static struct of_device_id water_match_table[] = {
    { .compatible = "thundersoft,water"},
    { },
};

static struct platform_driver water_driver = {
    .probe = water_probe,
    .remove = water_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = "water",
        .of_match_table = water_match_table,
    },
};

module_platform_driver(water_driver);
MODULE_AUTHOR("heql0703@thundersoft.com");
MODULE_LICENSE("GPL");

DragonBoard 410c开发板案例实战经验分享

-
  • 1970年01月01日 08:00

Dragonboard-410c - Debian系统的fastboot方式安装

因为机缘巧合(实验室不知道什么时候申报的一块Dragonboard 410c被闲置在角落),又因为自己想要试着玩一下,于是便开始了倒腾龙板的过程。龙板相较于目前很流行的树莓派来讲,资源要少得多。但是又...
  • u013662665
  • u013662665
  • 2017-10-25 19:27:52
  • 271

湘潭大学-基于Dragonboard 410c的实时公交站牌系统设计(二)

上篇博客已经介绍了基本的硬件需求和功能介绍,
  • s_jason
  • s_jason
  • 2017-10-17 12:05:33
  • 293

DragonBoard 410c手把手Linux开发

拿到DragonBoard 410c已经有很长一段时间,也试着研究了Adreno与410c上高通内核驱动。 不过为了让广大爱好者能够快速上手这一台开发板,我打算使用官方提供的Linux指南上的源码作为...
  • u010182064
  • u010182064
  • 2016-04-13 10:39:51
  • 6605

Qualcomm——DragonBoard 410C开发板评测

(PS: 转载)【96Boards规范】的开发板近几年非常火, 他们想统一开发板的标准, 让硬件变得更简单。 笔者也查阅了不少资料, 发现就目前来说,全球量产的符合96Boards规范的开发平...
  • oneqinglong
  • oneqinglong
  • 2017-04-17 18:02:26
  • 1946

快速下载和编译Dragonboard410c官网最新Android版本

最近刚入手一块Dragonboard410c开发板,准备用这块开发板自己搞搞几个智能家居类的原型玩玩,需要修改源代码的底层驱动,我比较熟悉Android系统,所以按着官方的开发编译文档一步步去弄,中间...
  • cgx090902
  • cgx090902
  • 2017-06-14 17:10:45
  • 1509

基于DragonBoard 410c的自动浇花机(一)

随着科技的进步,人们的生活质量越来越高。在家里养盆花不仅可以陶冶情操、丰富生活,而且盆花可以吸收二氧化碳净化室内空气,因此,养盆花如今被许多的人所喜爱。盆花浇水量是否能做到适时适量,是养花成败的关键。...
  • weixin_40109283
  • weixin_40109283
  • 2018-02-01 13:33:42
  • 255

初识DragonBoard 410c

初识DragonBoard 410c  DragonBoard 410c是一款搭载Qualcomm® Snapdragon™ 410(64位的四核处理器)的开发板,它功能齐全,具有强大的处理能力,内置...
  • cuichuankai
  • cuichuankai
  • 2015-11-10 16:35:15
  • 5182

DragonBoard 410c的配置与系统更新

需要的设备可运行Windows 10的PC(在上一片中已提到) DragonBoard 410c 12V电源供电—最小1.0A电流,如果您计划使用多个高耗能的USB配件,那么请选用大于2.0A电流的电...
  • u010182064
  • u010182064
  • 2015-11-28 15:32:25
  • 1390

给Dragonboard 410c开发板接上触摸屏显示器

博主最近准备基于Dragonboaard 410c做几个智能产品,需要用到显示器和触摸屏,但在官网搜了一下,发现都没有与开发板配套的显示器和触摸屏,没办法,只能去万能的淘宝上看有没适合的了。 淘宝上...
  • cgx090902
  • cgx090902
  • 2017-06-21 20:01:58
  • 768
收藏助手
不良信息举报
您举报文章:基于DragonBoard 410c的自动浇花机(二)
举报原因:
原因补充:

(最多只允许输入30个字)