EM9280 Linux下AD驱动的应用

 2013-5-8          [nemail]    
[lablebox]

1、Linux驱动程序调用方法概述

        在Linux环境中,通过驱动程序来操作相应硬件接口,对于应用程序来说就是打开特定文件名称的文件,然后通过常规的对文件读写或控制的方法,来实现对硬件接口的访问。在嵌入式系统中,对硬件的读写通常采用ioctl函数的形式,其典型的流程如下:

 


流程实现功能实现函数备注
第一步打开文件  fd = open(devname, …);  特定设备文件名称
第二步访问接口

  rc = ioctl(fd, cmd, …);

  rc = read(fd, buf, size);

  rc = write(fd, buf, size);

  可能调用多次,多种cmd
第三步关闭文件  close(fd);  不再操作,则关闭


 

        其中ioctl(…)的基本定义为:

        int ioctl(int fd, int cmd, unsigned long arg);

        输入参数 fd: 为打开文件获得的文件描述符
                         cmd: 操作命令码,在EM9280_drivers.h头文件中以定义
                         arg: 需要传递的参数指针,不同的命令必须严格匹配相应的参数类型

        返回值 = 0: 调用成功
                    = EBADF: 非法文件描述符
                    = EFAULT: arg指向不可访问的内存空间 
                    = EINVAL: 非法的cmd或arg参数
                    = ENOTTY: 文件描述符未指向特殊的字符设备

 

2、EM9280 AD驱动的应用

        EM9280共有2路低速的模拟AD通道AIN1和AIN2,输入量程为0 – 3.6V,AD分辨率12-bit。所谓低速通道,表示这两个通道只能用于外部的直流或慢变化类型的信号。除此之外,EM9280还可提供对输入的+5V电源电压、+3.3V电源电压以及核心CPU基片温度的监测。

 

        EM9280 AD驱动是以模块(module)形式提供给客户,相应的驱动文件放在根文件系统中:/lib/modules/2.6.35.3/em9280_ad.ko,EM9280 AD驱动所对应的设备文件名称为“/dev/em9280_ad”。

 

        首先需要加载em9280_ad驱动:
        #>insmod /lib/ modules/2.6.35.3/em9280_ad.ko

 

        然后应用程序可打开AD驱动程序对应的设备文件“/dev/em9280_ad”,可多次调用read( )来读取各类数据。read( )函数需要带上如下结构数据:

 

        struct daq_info
        {
                unsigned int cmd; // 命令码 = 0, 1, 2, ....
                unsigned int data; // 返回的AD数据
                char unit[16]; // 返回的单位字串: 'mV', 'Kalvin'等 
        } ;

 

        其中cmd参数用于定义AD通道:
        0 ---- AD采集通道1
        1 ---- AD采集通道2 
        2 ---- +5V电源电压
        3 ---- +3.3V电源电压
        6 ---- 核心CPU基片温度

 

        注意返回的温度参数均为开氏温度,转换成摄氏温度,大致减去273即可。在此基础上,应用程序的典型代码如下:

 

        int main(int argc, char** argv)
        {
                int fd;
                int i1, rc;
                int nChIndex;
                struct daq_info ad;

                printf('Driver em9280_ad test v1.0\n');

                nChIndex = 1;
                if(argc > 1)
                {
                        nChIndex = atoi( argv[1] );
                }

                fd = open('/dev/em9280_ad', O_RDWR);
                printf('open file = %d\n', fd);
                if( fd<0 )
                {
                        return -1;
                }

                ad.cmd = nChIndex;

                for( i1=0; i1<20; i1++)
                {
                        rc = read(fd, (void*)&ad, sizeof(ad) );
                        printf( 'nValue = %d (%s)\n', ad.data, ad.unit );
                        sleep(1);
                }

                close(fd);
                printf('close file\n');
                return 0;
        }

[lablebox]