查看: 764|回复: 0

Tiger Board开箱体验

[复制链接]
  • TA的每日心情
    开心
    2016-1-31 15:18
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-3-18 13:37:32 | 显示全部楼层 |阅读模式
    分享到:
    由于我把板子邮到学校了,所以开学才开始弄,现在才来分享经验,真是抱歉。我做的是利用Tiger Board 实现家庭信息远程感知。
        首先上图,开箱。


    GOBOARD板给人的整体感觉紧凑,板上搭载了十分强大的ARM Cortex——A9芯片,4G内存以及扩展SD卡槽,给了该开发板安装其他类LINUX操作系统的空间,总而言之这块开发板不论外观还是功能都十分强大。
    2.安装操作系统
    因为GOBOARD自带的是基于安卓系统开发的GODROID,而我的设计需要在LINUX平台上实现,所以从官网下载了基于debian的GObian操作系统,并安装为纯字符界面开发环境(节约资源且功能足够),这里因为开发板不自带显示屏,所以在网上买了一块车载显示器作为替代,以完成基本功能。


    3.设计基本思路
    通过LINUX系统内核提供的强大网络服务支持,可以将开发板感知到的信息利用网络发送到网络云平台,这里我选用的是阿里云,租用一台基本功能的LINUX的服务器,就可以通过程序建立开发板与服务器之间的网络连接,而用户只需要登录云平台就可以看到家中数据,根据所接外部传感器的种类不同我们这里可以实现多种信息的感知,这个设计中主要实现了温度的感知以作为示范。
    4.温度传感器的驱动
    虽然说现在硬件的资源非常丰富而且剩余很多,可以用软件资源来代替硬件资源,比如说可以用视频编解码软件取代硬件来工作。但有很多模块需要实时的采集数据这都是软件永远无法代替的,而且随着互联网的进一步发展,智能化也是一个必然的趋势,因此大量的传感器和控制芯片将被应用到生产生活中,所以个人觉得驱动开发还是个不错的方向。同时,作为学习者,再进行嵌入式linux开发过程中,可以接触到软件和硬件,对它们如何协同工作有了更加深刻的理解。
    以ds18b20的写时序为例描述这个对话过程:当我们的单片机(主控芯片)想要ds18b20执行任务的时候必须要告诉他任务,这个任务就是通过写命令发出的,单片机先拉低与ds18b20相连接IO口电平然后持续15us,它就好比给ds18b20说:“孩子,有任务 来了,过来取任务吧!“,ds18b20听到后就过来了,然后看看它与单片机相互链接的”专线“现在是高电平还是低电平,是高电平记为1,低电平是0.这样它反复接了8次就是一个完整的命令,ds18b20一看这个命令数据是0xbe,就知道单片机要来读温度数据了。
    在linux 系统下给ds18b20写驱动还是有不少方便的,ds18b20是一个对时间很敏感的器件,linux 中的udelay/ndelay为我们提供了微秒以及纳秒级别的精确延时,这点很方便。
    另外系统给我提供了,s3c2410_gpio_setpin,s3c2410_gpio_getpin,等IO口操作函数,可以让我们方便的设置IO口的高低电平。它们中尤其值得注意的是s3c_2410_getpin函数,这个函数当IO口设置为input时,也就是输出的时候,它的返回值是0或者大于1的数,这里千万不要误以为返回值为1.特别是在编写读一个字节用到时,需特别注意。
    关于嵌入式linux驱动————链接和规范
    linux驱动的核心还在于器件本身,建议编写某个模块的 器件时,先熟悉器件在裸板上的驱动,先把这个器件的驱动每个细节搞清楚,然后在linux下只要注意规范和提供接口就可以了。
    step1:要创建linux系统可接纳的驱动,我们必须向linux申请一个设备号以給我们的设备 用。
    创建设备在2.6内核以前的版本是很easy的,只需要一个函数,便可申请/分配设备内存/注册设备,但是以后的内核机制中,这种方便的东西就被废除了,因为以前是我们设定一个设备号,然后申请,这种做法在linux大量应用时容易造成设备号重复冲突。因此在新的内核机制中建议大家动态的申请设备号,这样以来系统便会自动找到一个没有使用的设备号。linux 中比较经典的处理方法来自ldd书中的这段:

    dev_t dev;
    dev=MKDEV(ds18b20_major,ds18b20_minor);
            if(ds18b20_major
            {
                 ret=register_chrdev_region(dev,ds18b20_devs,"ds18b20");
            }
            Else
            {
                 ret=alloc_chrdev_region(&dev,ds18b20_minor,ds18b20_devs,"ds18b20");
               ds18b20_major=MAJOR(dev);
           }

    dev_t是用来保存设备编号的类型,MKDEV是主次设备号转换成dev_t类型。
    然后就是检测主设备号是否为0,为0则标示要进行动态申请设备号。这里一般建议采用动态申请的方式。
    申请完毕后可以用MAJOR(dev)来获取申请的主设备号。
    step2:file_operactions函数的书写
    有了上面的两步之后那我们就开始填空啦!
    这次填空分为两步,需要两个函数,第一个是cdev_init,第二个是cdev_add;
    有了这两个函数我们进行填空:1 首先调用cdev_init;将我们的file_operactions填进去。

    这个函数就将我们的设备号同设备关联起来了,这样以来我们的字符设备结构体就填充完毕了,我们就将这个字符设备加入到内核里面了。
    这样以来我们的字符设备——设备编号——file_operactions就建立起了联系,而file_operactions又是系统函数的枢纽,所以这样在编写系统的应用函数的时候,我们就可以通过联系设备的节点而知道该操作那个设备的file_operactions了,因为它们变成了一个环,通过其中的一节一定能够找到环中的另一节。
    这样看来还少设备节点啊!下面还需要做的就是创建一个设备节点, 创建设备节点的时候我们一般采用自动创建设备节点的办法,linux中为我们提供了struct class结构体,这个结构体对应一个类,我们用class_create函数来创建一个存放于sysfs里面的类,然后调用device_create就可以创建一个设备节点了。




    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 02:21 , Processed in 0.118151 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.