浙江大学嵌入式系统的终极boss。
实验目的
- 掌握Linux设备驱动程序的开发过程;
- 理解I2C总线协议;
- 复习socket编程(网络原理课);
- 实现一个网络访问的LED矩阵显示器。
实验器材
- 硬件
- 树莓派2代板一块;
- 5V/1A电源一个;
- microUSB线一根;
- 面包板一块;
- 8x8 LED矩阵一块(不带I2C控制器);
- 360Ω 1/8W电阻8颗,或360Ω 排阻1颗;
- 面包线若干。
以下为自备(可选)器材: - PC(Windows/Mac OS/Linux)一台;
- USB-TTL串口线一根(FT232RL芯片或PL2303芯片);
- 以太网线一根(可能还需要路由器等)。
- 软件
- 编译软件。
实验步骤
设计外部设备方案,画连线示意图;
(Fritzing里找不到合适大小的led矩阵,就这么凑合一下了)
在面包板上连线,完成外部电路;
实物连接图
编写Linux应用程序,能通过第六次实验的GPIO库控制LED矩阵显示字母数字;
这个相对简单,这里我使用了python编写应用程序,使用RPi.GPIO库
显示的时候需要另起一个线程,可以使用python中的thread库
首先讲一下MT07088BK的管脚网上找到这么一张管脚图,不过看了之后依旧不是很清楚,测试之后发现实物上的管脚编号大致如下
- 实现代码参见led_mat_test.py
编写Linux设备驱动程序,能通过寄存器操纵GPIO控制LED矩阵,将这个LED矩阵做成/dev/ledmatrix,之 后能 通过cat命令输出字母数字来显示;
首先我们需要准备一些工具,包括树莓派的交叉编译环境以及树莓派系统源代码
交叉编译环境之前都已经做过了这里不再赘述,这里主要说一下系统源代码以及一些其他注意事项
树莓派的系统代码我们可以从官方的github上clone下来,这里面包括了我们编译内核模块必要的一些文件1git clone https://github.com/raspberrypi/linux.git另外在开始之前最好保证你当前的系统与你下载的源码版本一致,不然你插入内核模块的时候会因为内核版本不一致而失败
树莓派可以简单地通过一条命令更新内核到最新版本,这样的话只要下载最新版本的内核源代码就行了1sudo rpi-update当然事实上我这样做了以后发现版本还是不一致,我更新以后树莓派的内核版本是3.18.14v7+,但是编译出来的内核模块显示对应内核版本总是3.18.14v7,原因不是很明白,不过几经查阅总算找到一个解决办法。直接修改include/generated/utsrelease.h内的版本号
1然后就可以愉快的开始编写我们的内核模块了
实验要求基本上只要写一个简单的字符设备驱动,所以我们要做的其实主要就是在内核中注册好我们的字符设备,并且实现它相应的一些文件操作(read、write之类)
需要注意的是实验要求能够cat显示字符,cat实际上是做打开读取再关闭的操作,但是读取的时候它会一直读取知道读到EOF(0),所以我们在实现read函数时不能忘记返回0
另外关于gpio操作,可以使用linux/gpio.h中提供的一些函数接口,非常方便。
显示的时候需要另起一个线程,这里需要编写内核线程的一些知识。
下面是一些操作字符设备以及内核打印调试信息的截图- 驱动模块代码参见ledmatrix.c
- Makefile文件参见Makefile
编写Linux应用程序,能通过TCP接受一个连接,将发来的文字在LED矩阵上流动显示出来。
最后一部分考虑流动显示的部分,我没有用前一个部分写好的驱动,因为那个驱动只能单独显示字符集中的字符,因此我又重新利用gpio库重写了显示逻辑
我利用树莓派做主机,监听10000端口,PC及去连接这个端口,并发送一些信息,树莓派收到信息后会流动显示发来的字符串,显示完成后会给PC发送消息表示显示完成,接着接收之后的消息。
实现代码参见tcp_ledmat_rpi.py及tcp_ledmat_pc.py