デバイス制御文字 - 実際の戦闘の4412開発ボードのLinuxシステムプログラミング

Linuxではドライバがドライブにすでに、独自の文字、または文字を書くために、ドライブの背後にある知識を学んでいるかどうか、この章では、キャラクタ・デバイス・アプリケーション・プログラムを導入し、文字を習得しなければならない運転している、必要性は、単純なアプリケーションを作成することができるようにします。

でも、Linuxドライバの後に書かれたのlinux-駆動仕事、で、また、テストに簡単なアプリケーション・プログラマを記述する必要によって駆動。

また、駆動部に対して、高速の電子が誰にでも利用できる学習の特別なドライブテストチュートリアルを持って、我々は非常に簡単になりますこれらの基本的な基盤となる知識を習得行かなければなりません。

マニュアルの第八章では、我々はこれらのCプログラムはまた、以下のAndroid上で実行することができます見ることができますが、ないグラフィカルなインターフェイスはありません。

ハードウェアツール

開発ボードPC、4412; U-ディスクまたはTFカード

ソフトウェアツール

Ubuntu12.04.2と仮想マシン、アーム-2009q3コンパイラ;メモ帳++エディタ、ハイパーターミナル、Vimのエディタ、最小限のLinuxシステム

 予科

一般的に使用されるLinuxのコマンド;基本的な開発ツールを使用して、最小限のLinuxシステムを、ファイルIOを

ビデオのリソース

この章では、ビデオをサポートしています:

「ビデオ06_01キャラクタデバイス主な機能の制御は、パラメータを渡します」

「映像制御装置06_02 LEDライト文字」

「ブザーブザーのビデオ06_03キャラクタデバイス制御」

「コントロールのデジタル変換動画06_04キャラクタデバイスのADCアナログ」

学習目標

使用法の主な機能をマスター

デジタル変換された文字デバイスLEDランプ、ブザーブザー、ADCのアナログをつかみ

主な機能パラメータエントリ

誰もがC言語を学んだが、C言語の主な機能を使用するものの、為替やユーザーの方法では非常に明確ではありません。セクションの職業に、ここで、この知識を使用する実験の必要性の後半から、簡単には、主な機能を説明します。

1.1主な機能の紹介

ヘッダファイル内のアプリケーション・エントリの主な機能「の#include <stdio.hの>」として。

主な機能は、完全として定義されたパラメータを渡す必要がある場合

int型のmain(int型のargc、char型** ARGV)

パラメータargcが、パラメータの数を示し、

** argvのパラメータアレイ、入力文字を保存します

ARGV [0]は、プログラムの名前を表します

ARGV [1] - のargv [n]を入力パラメータ

パラメータを渡すことはありません。時間は以下のように定義されます

メインint型(無効)

メイン関数の戻り値は、実行が成功したかどうかを決定するために、int型であります

1.2main機能ルーチン

主な機能argvc.c簡単なテストファイルを作成します。

 

 

 

 

 

 

 

上記のように、第一及び第二の入力パラメータは、int型に変換され、i及びjは、最終出力印刷に割り当てられます。ARGV [0]はプログラム名である場合、これは戻ってコンパイルされたオブジェクトファイル「argvc」にあります。

1.3コンパイルと実行テスト

、前の実験「/ホーム/ linuxsystemcode /」で作成したディレクトリに、以下のように、Ubuntuのシステムでは

図に示すように、新しいフォルダcharcontrolに、ソースコードにコピーされた「MKDIR charcontrol」新charcontrolフォルダ、argvc.cのコマンドを使用します。

 

 

 

 

 

コマンドを使用して、以下のように「LS」はargvc生成された実行可能ファイルを参照して、「アームなし-Linuxベースgnueabi-GCC -o argvc argvc.c -static」argvcコンパイルされたファイルコマンドを使用します。

 

 

 

 

 

 

 

Uディスクのコピーコード方式ですここでは、ファイルシステム、参考実験02の特に方法にコンパイルすることができます

コンパイルされた実行可能ファイルargvc、Uは次のようにプログラムを実行し、Uディスクがロードされ、Uディスクに、ボードを始め、ディスクにコピー。

 

 

 

 

 

 

上記のように、正常に印刷を実行します。

プログラム名は./mnt/udisk/argvcです。プログラムの実行は、「./mnt/udisk/argvc」であるので、

これは最初のパラメータであります

コマンドラインは2引数があります。

10、11。入力パラメータは、10と11であり、対応のargv [2]とargv [2]。

クラス2文字のLEDランプ

オープン時間の前に説明した機能には、すでに私たちは、文字クラスの設備を有効にする方法述べた方法と、一般的にハンドルを取得

ファイルは同じです。

ハイパーターミナルLSに示すように、/ devディレクトリ内のLEDランプ装置ノードは、検索するためのコマンド。

 

 

 

 

 

 

由于涉及到硬件知识,这里简单介绍一下硬件原理,如下图所示,led 小灯的硬件原理很简单。

 

 

 

 

 

 

 

如上图所示,给 KP_COL0 和 VDD50_EN 网络高电平,三极管 L9014 就会导通,电源 VSYS 就会将电压加到电阻 R 和 led 小灯上,小灯就会亮。

给 KP_COL0 和 VDD50_EN 网络低电平,三极管 L9014 就会截止,形成断路,小灯灭。

 

在前面介绍过,如果要给文件进行写操作,那么使用的是 write 函数。对于 led 小灯的操作,使用写函数,理论上也是可以的。但是对于 IO 口(这里的 IO 口指的是硬件上的 IO 口, 不是指 IO 文件)的操作,Linux 专门设计了一个高效的函数 ioctl。

这个函数在头文件#include<unistd.h>中。

int ioctl( int fd, int request, int cmd);

参数 fd,函数 open 返回的句柄。

参数 request 和参数 cmd,由内核驱动决定具体操作,例如 request 可以代表那个 IO 口, cmd 代表对 IO 进行什么样的操作,也可以反过来。具体的含义由驱动工程师在驱动中 switch决定。

返回值:返回 0 成功;返回-1,出错。

2.1小灯测试例程

编写简单的 leds.c 文件测试小灯。

首先添加头文件,如下图所示。

通过 main 参数传过来的参数是 char 字符格式的,如果要传递给 ioctl 函数,需要用到数

值转化函数 atoi,添加了头文件#include <stdlib.h>。

接着由于小灯的数量和命令都是 2,所以对小灯数量和操作数进行宏定义#define LED_NUM 2 #define LED_C 2。

 

 

 

 

 

然后 main 函数如下图所示。

 

 

 

 

 

 

 

如上图所示。

第 33 行,调用了 ioctl 函数,将 main 函数的第一个和第二个参数传入驱动。

第 19 行,解释那个参数具体代表什么含义,"argv1 is cmd;argv2 is io”,参数 1 对应命

令,参数 2 对应具体那个 led 灯。

第 36 行,将打开的设备节点"/dev/leds"关闭。

2.2 编译运行测试

在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录

“/home/linuxsystemcode/charcontrol”,将源码 leds.c 拷贝进去,如下图所示。

 

 

 

 

 

 

 

使用命令“arm-none-linux-gnueabi-gcc -o leds leds.c -static”编译 leds 文件,如下

图所示,使用命令“ls”可以看到生成了 leds 可执行文件。

 

 

 

 

 

 

这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考实验 02

将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序如下。

如下图所示,如果不加参数会有提示,然后报错。

 

 

 

 

 

 

 

如下图所示,使用命令“./mnt/udisk/leds 0 0”运行,可以看到靠近蜂鸣器的小灯灭了。

 

 

 

 

 

 

所有参数对小灯的控制如下:

0 0 靠近蜂鸣器的小灯灭;

0 1 靠近按键的小灯灭;

1 0 靠近蜂鸣器的小灯亮;

1 1 靠近按键的小灯亮。

用户可以自行测试一下。

3 字符类 Buzzer 蜂鸣器

和 led 灯类似,蜂鸣器的设备节点也是在/dev 目录下,如下图所示。

 

 

 

 

 

 

蜂鸣器的硬件和 led 灯类似,如下图所示。

 

 

 

 

 

 

如上图所示。

原理图很容易理解,如果网络 MOTOR_PWM 为高电平,则 L9014 导通,蜂鸣器响,如

果网络 MOTOR_PWM 为低电平,则 L9014 截止,蜂鸣器则不响。

操作方式和 led 小灯类似。

3.1蜂鸣器测试例程

编写简单的 buzzertest.c 文件测试蜂鸣器。

首先添加头文件,如下图所示,下面新加了几个库文件,一般常用的就是下面几个,写代

码的时候,为了方便,可以直接都添加上。

 

 

 

 

 

 

 

然后 main 函数如下图所示。

 

 

 

 

 

 

如上图代码所示。

由于只有一个 IO,底层没有做第三个参数的判断,所以无效

第 16-19 行,对参数 argv[1]有个简单的判断,命令只能是 0 或者 1。

第 21-24 行,open 函数打开蜂鸣器设备节点

第 26 行,使用 ioctl 函数操作蜂鸣器。

第 27 行,使用 close 函数关闭设备节点。

3.2 编译运行测试

在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录

“/home/linuxsystemcode/charcontrol”,将源码 buzzertest.c 拷贝进去,如下图所示。

 

 

 

 

 

 

使用命令“arm-none-linux-gnueabi-gcc -o buzzertest buzzertest.c -static”编译 buzzertest 文件,如下图所示,使用命令“ls”可以看到生成了 buzzertest 可执行文件。

 

 

 

 

 

这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考实验 02

将编译成的可执行文件 buzzertest,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘, 运行程序如下。 使用参数 1 和 0,蜂鸣器会响。第二个参数实际上并不起作用。

 

 

 

 

 

如下图所示,使用参数 0 和 0,蜂鸣器会停止响。

 

 

 

 

 

4字符类 ADC 模数转换

和 led 灯类似,数模转换的设备节点也是在/dev 目录下,如下图所示。

 

 

 

 

 

模数转换的硬件部分如下图所示。

 

 

 

 

 

 

 

如上图所示。

XadcAIN0 网络可以读取到当前输入电压,滑动变阻器 R 移动的时候,1 和 2 之间的电阻 R12 改变,滑动变阻器最大电阻为 R13,然后电压 Vadc=R12*VDD1V8_EXT/R13 上面公式中 Vadc 可以通过 4412 读取出来,VDD1V8 和 R13 已知,那么就很容易求出 R12 的电阻。如下图所示,在 4412datasheet 中 ADC 章节中有真实的电阻和电压曲线图。

 

 

 

 

这里将数值做一个简单的换算,

1.8V 对应的是 10K 欧姆,对应的寄存器数值为 0xfff;

0V 对应的是 0 欧姆,对应的寄存器数值为 0x0。

这样做一个简单公式,将读取的数值 r 转化为电阻值 R。

R = r*10000/0xfff,即 R = r*10000/4095。

这个小公式在后面的代码中将会使用到。

4.1模数转换例程

编写简单的 ADC.c 文件测试 adc 的驱动。

首先添加头文件,如下图所示。

 

 

 

 

然后 main 函数如下图所示。

 

 

 

 

如上图代码所示。

第 14 行,设备节点为 char *adc = "/dev/adc"。

第 21 行,打开设备节点文件。

第 26 行,使用 read 函数,将读取数字赋予 buffer。

第 30 和 31 行,做个简单地换算,将读取的数值转化为电阻值。

4.2编译运行测试

在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录

“/home/linuxsystemcode/charcontrol/”将源码 ADC.c 拷贝进去,如下图所示。

 

 

 

 

使用命令“arm-none-linux-gnueabi-gcc -o ADC ADC.c -static”编译 ADC 文件,如 下图所示,使用命令“ls”可以看到生成了 ADC 可执行文件。

 

 

 

 

这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考实验 02

将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程 序。

如下图所示,使用命令“./mnt/udisk/ADC”即可检测当前电阻值,中间的大段打印参数 是多次打印寄存器的数值,在驱动实验中再去介绍。

 

 

 

 

 

调整滑动电阻器之后,再次使用测试程序,如下图所示,输出数值会有变化。

 

 

 

 

 

 

 

滑动变阻器向顺时针旋转,阻值会减小,最小为 0;

滑动变阻器向逆时针旋转,阻值会增大,最大为 10K。

http://topeetboard.com

おすすめ

転載: www.cnblogs.com/yueliang17/p/11996852.html