基于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定制Android系统

上一篇博文《初识DragonBoard 410c》已经为大家简单介绍了DragonBoard 410c这款平台,并且也介绍了Ubuntu系统和Android系统烧写方法。今天,将介绍一下Android...
  • cuichuankai
  • cuichuankai
  • 2015年11月16日 15:25
  • 3368

Dragon board 410c硬件简述

Dragon board 410c硬件简述 板载模块概述 按照图上所示,我们分别列举了红字中的模块信息: 基于硬件进行入门需要准备的工具 410c 开发板  1.7mm的电...
  • u010182064
  • u010182064
  • 2015年12月19日 22:21
  • 1446

adb调试Dragonboard 410c

前天在Dragonboard 410c上调试USB触摸屏,发现单独在USB口上插上触摸屏,触摸屏是有效果的,但是TP的坐标值不对,需要进行校正,但是把板子上的mini USB口接上PC时,触摸屏就没效...
  • cgx090902
  • cgx090902
  • 2017年06月21日 15:13
  • 438

DragonBoard 410c手把手Linux开发

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

DragonBoard 410c手把手进行安卓开发之底层移植

耽误了这么久,终于开始写这篇文章了 这篇文章我们主要介绍如何从获取MSM源码,并为内核进行修改与移植的过程必须的前期准备首先我们需要准备如下四个条件: 1. Ubuntu 12.04 Linux ...
  • u010182064
  • u010182064
  • 2016年05月02日 10:14
  • 2246

初识DragonBoard 410c

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

Qualcomm——DragonBoard 410C开发板评测

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

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

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

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

Dragonboard 410c使用fastboot安装Debian
  • u013662665
  • u013662665
  • 2017年10月25日 19:27
  • 187

DragonBoard 410c的配置与系统更新

需要的设备可运行Windows 10的PC(在上一片中已提到) DragonBoard 410c 12V电源供电—最小1.0A电流,如果您计划使用多个高耗能的USB配件,那么请选用大于2.0A电流的电...
  • u010182064
  • u010182064
  • 2015年11月28日 15:32
  • 1323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于DragonBoard 410c的自动浇花机(二)
举报原因:
原因补充:

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