经过前面的学习,我们了解了驱动开发的框架,本章节将带领大家实验操作,写最简单的驱动-helloworld。
Linux 设备驱动会以内核模块的形式出现,因为 linux 内核的整体架构就非常庞大,包含的组件也非常多,如果把所有的功能都编译到 linux 内核中会使得内核非常臃肿,为了解决这个问题,更方便地新增和删除功能,linux 提供了这样的机制,这种机制被称为模块。为了大家对模块有一个感性的认识,我们先来看一个最简单的驱动-helloworld。
驱动分为四个部分:
头文件
驱动模块的入口函数和出口函数
声明信息
功能实现
我们在 windows 上面新建一个 helloworld.c 文件,这里使用 sourceinsight 来编辑文件,大家也可以用其他编译器来编写程序。
第一步 包含头文件
#include //包含宏定义的头文件
#include //包含初始化加载模块的头文件
第二步 驱动模块的入口函数和出口函数
module_init();
module_exit();
第三步 声明模块拥有开源许可证
MODULE_LICENSE("GPL");
第四步 功能实现:内核模块加载的时候打印 hello world! ,内核模块卸载的时候打印 gooodbye!
注意:内核打印函数不能用 printf,因为内核没有办法使用 C 语言库。
static int hello_init(void){
printk("hello world!
");
return 0;
}
static void hello_exit(void){
printk("gooodbye!
");
}
完整的一个最简单的 Linux 内核模块,如下图所示:
此时,我们需要有一个感性认识,代码中的某些陌生元素都是 linux 内核为了字符设备定义的,以实现驱动与内核接口而定义的。Linux 对各类设备的驱动都定义了类似的数据结构和函数。
核心板参数
尺寸:38mm*42mm
PCB:6层
CPU:iMX6ULL ARM Cortex-A7架构 单核
iMX6ULL 商业级 内存:512M 存储:8G EMMC
iMX6ULL 工业级 内存:256M 存储:512M FLASH
工作电压:5V~16V 电压供电
系统支持:Linux-QT系统;Ubuntu core系统;Youcto系统;Buildroot系统;
商业级运行温度:-20℃ ~ +80℃
工业级运行温度:-40℃ ~ +80℃
引脚间距:1.27mm
引角扩展:i.MX6功能全部引出,146PIN脚
连接方式:邮票孔
底板参数
尺寸:12*19cm
PCB:2层
POWER:5V~16V电压供电
SWITCH:电源开关
EEPROM 存储:256字节,掉电后数据不丢失
4G模块:1个 全网通 (选配)
WIFI蓝牙模块:WIFI/蓝牙二合一模块,工作频段 2.4GHz,支持 IEEE802.11bgn 等标准,支持蓝牙 4.0 协议。
LVDS接口:1路(一个是标准HDMI 座(CON3),另一个是 30pin 的 FPC 座(J18), 两个接口实际上是同一路 LVDS 信号,用来连接迅为电子的 LVDS 屏幕)
RGB接口:1路
CAN:2 路 CAN 总线接口
RS485:1 路 RS485 总线接口
MIC:支持录音输入
PHONE:支持耳机输出
USB OTG:1路
USB HOST:2路
USB-UART:1路
mini HDMI:1个(一路标准MINI-HDMI 接口,i.MX6ULL处理器本身没有支持HDMI,通过一个 RGB 转 HDMI 的芯片扩展出HDMI接口,通过该接口来连接HDMI显示器。 )
网口:2路百兆以太网,RJ45 接口
TF卡槽:1个标准TF卡接口
SIM卡槽:1个标准SIM卡接口
T&H接口:温湿度传感器接口
TTL/RS485接口:TTL/RS485接口二选一
BUZZER:1个蜂鸣器
IRDA:1个红外一体化接收头
ADC电位器:支持
DIP SWITCH:8位拨码开关
JTAG:1个(可以通过下载/调试器来调试 i.MX6ULL 处理器)
CAMERA接口:1个 支持500万摄像头
TTL串口接口:20PIN (gpio引出:两个ad,一个spi,一路ttl。一路i2c,5个gpio,5v,3.3v电源)
GPIO接口:20PIN(包括:两路ADC,一路SPI,5个GPIO,一路TTL串口,一路I2C接口。)
重力加速度传感器:支持
红外接收模块:支持
光环境传感器:支持
实时时钟:断电后系统时间不丢失
LED:2个
按键:3个