電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 1410|回復(fù): 0
收起左側(cè)

嵌入式學(xué)到了什么_英創(chuàng)信息技術(shù)EM9280 Linux下AD驅(qū)動(dòng)的應(yīng)用介紹

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級(jí)會(huì)員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-7-22 10:53:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
嵌入式學(xué)到了什么_英創(chuàng)信息技術(shù)EM9280 Linux下AD驅(qū)動(dòng)的應(yīng)用介紹,   

1、Linux驅(qū)動(dòng)程序調(diào)用方法概述

        在Linux環(huán)境中,通過驅(qū)動(dòng)程序來操作相應(yīng)硬件接口,對(duì)于應(yīng)用程序來說就是打開特定文件名稱的文件,然后通過常規(guī)的對(duì)文件讀寫或控制的方法,來實(shí)現(xiàn)對(duì)硬件接口的訪問。在嵌入式系統(tǒng)中,對(duì)硬件的讀寫通常采用ioctl函數(shù)的形式,其典型的流程如下:
流程 實(shí)現(xiàn)功能 實(shí)現(xiàn)函數(shù) 備注
第一步 打開文件   fd = open(devname, …);   特定設(shè)備文件名稱
第二步 訪問接口
   rc = ioctl(fd, cmd, …);
   rc = read(fd, buf, size);
   rc = write(fd, buf, size);
   可能調(diào)用多次,多種cmd
第三步 關(guān)閉文件   close(fd);   不再操作,則關(guān)閉


        其中ioctl(…)的基本定義為:

         int ioctl(int fd, int cmd, unsigned long arg);
         輸入?yún)?shù) fd: 為打開文件獲得的文件描述符
                          cmd: 操作命令碼,在EM9280_drivers.h頭文件中以定義
                          arg: 需要傳遞的參數(shù)指針,不同的命令必須嚴(yán)格匹配相應(yīng)的參數(shù)類型
         返回值 = 0: 調(diào)用成功
                     = EBADF: 非法文件描述符
                     = EFAULT: arg指向不可訪問的內(nèi)存空間
                     = EINVAL: 非法的cmd或arg參數(shù)
                     = ENOTTY: 文件描述符未指向特殊的字符設(shè)備

2、EM9280 AD驅(qū)動(dòng)的應(yīng)用

        EM9280共有2路低速的模擬AD通道AIN1和AIN2,輸入量程為0 – 3.6V,AD分辨率12-bit。所謂低速通道,表示這兩個(gè)通道只能用于外部的直流或慢變化類型的信號(hào)。除此之外,EM9280還可提供對(duì)輸入的+5V電源電壓、+3.3V電源電壓以及核心CPU基片溫度的監(jiān)測(cè)。

         EM9280 AD驅(qū)動(dòng)是以模塊(module)形式提供給客戶,相應(yīng)的驅(qū)動(dòng)文件放在根文件系統(tǒng)中:/lib/modules/2.6.35.3/em9280_ad.ko,EM9280 AD驅(qū)動(dòng)所對(duì)應(yīng)的設(shè)備文件名稱為“/dev/em9280_ad”。

         首先需要加載em9280_ad驅(qū)動(dòng):
         #>insmod /lib/ modules/2.6.35.3/em9280_ad.ko

         然后應(yīng)用程序可打開AD驅(qū)動(dòng)程序?qū)?yīng)的設(shè)備文件“/dev/em9280_ad”,可多次調(diào)用read( )來讀取各類數(shù)據(jù)。read( )函數(shù)需要帶上如下結(jié)構(gòu)數(shù)據(jù):

         struct daq_info
         {
                 unsigned int cmd; // 命令碼 = 0, 1, 2, ....
                 unsigned int data; // 返回的AD數(shù)據(jù)
                 char unit[16]; // 返回的單位字串: \“mV\“, \“Kalvin\“等
         } ;

         其中cmd參數(shù)用于定義AD通道:
         0 ---- AD采集通道1
         1 ---- AD采集通道2
         2 ---- +5V電源電壓
         3 ---- +3.3V電源電壓
         6 ---- 核心CPU基片溫度

         注意返回的溫度參數(shù)均為開氏溫度,轉(zhuǎn)換成攝氏溫度,大致減去273即可。在此基礎(chǔ)上,應(yīng)用程序的典型代碼如下:

         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;
         }

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表