SPI OLED 驱动
根据之前说过的 SPI 驱动的框架,在我们添加 SPI 设备驱动的时候需要与 SPI Master 完成匹配,通过 spi_register_board_info 进行注册。
构造设备
static struct spi_board_info spi_info_mini2440 = {
.modalias = "oled", /* 对应的 spi_driver 名字也是 "oled" */
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
.bus_num = 0, /* mini2440 里 OLED 接在 SPI CONTROLLER 0 */
.mode = SPI_MODE_0,
.chip_select = S3C2410_GPG(1), /* oled_cs, 它的含义由 spi_master 确定 */
.platform_data = (const void *)S3C2410_GPF(3) ,/* oled_dc, 它在 spi_driver 里使用 */
}
然后调用 spi_register_board_info 函数完成注册。
内核没有实现对 spi_register_board_info 进行 export_symbol 导出,我们不能在模块中来调用,所以需要修改对应 Makefile 将这个文件编进内核。
设备驱动
/* 构建 spi_driver 结构体 */
static struct spi_driver spi_oled_drv = {
.driver = {
.name = "oled",
.owner = THIS_MODULE,
},
.probe = spi_oled_probe,
.remove = __devexit_p(spi_oled_remove),
};
/* probe 函数 */
static int __devinit spi_oled_probe(struct spi_device *spi)
{
spi_oled_dev = spi;
spi_oled_dc_pin = (int)spi->dev.platform_data;
/* 配置 dc、cs 引脚为 output */
s3c2410_gpio_cfgpin(spi_oled_dc_pin, S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(spi->chip_select, S3C2410_GPIO_OUTPUT);
/* 供 copy_from_user 使用 */
ker_buf = kmalloc(4096, GFP_KERNEL);
/* 注册一个 file_operations */
major = register_chrdev(0, "oled", &oled_ops);
class = class_create(THIS_MODULE, "oled");
/* 为了让 mdev 根据这些信息来创建设备节点 */
device_create(class, NULL, MKDEV(major, 0), NULL, "oled"); /* /dev/oled */
return 0;
}
probe 函数中通过 register_chrdev 创建一个字符设备,然后通过其 ioctl、write 调用 oled 的初始化和写内存函数来完成对 oled 的操作。
最后调用 spi_register_driver 函数完成设备驱动的注册。
测试程序
/* page: 0-7
* col : 0-127
* 字符: 8x16象素
*/
void OLEDPutChar(int fd, int page, int col, char c)
{
int i = 0;
/* 得到字模 */
const unsigned char *dots = oled_asc2_8x16[c - ' '];
/* 发给OLED */
OLEDSetPos(page, col);
ioctl(fd, OLED_CMD_CLEAR_PAGE, page);
ioctl(fd, OLED_CMD_SET_POS, page | (col << 8));
/* 发出8字节数据 */
for (i = 0; i < 8; i++)
OLEDWriteDat(dots[i]);
write(fd, &dots[0], 8);
OLEDSetPos(page+1, col);
ioctl(fd, OLED_CMD_CLEAR_PAGE, page+1);
ioctl(fd, OLED_CMD_SET_POS, (page+1) | (col << 8));
/* 发出8字节数据 */
for (i = 0; i < 8; i++)
OLEDWriteDat(dots[i+8]);
write(fd, &dots[8], 8);
}
通过调用 ioctl 与 write 接口就可以完成对 oled 的测试。
SPI OLED 驱动的更多相关文章
- 使用Vivado初探ZedBoard的OLED驱动
一.原理简介 Vivado版本:2016.2 OLED型号:128*32的UG-2832HSWEG04 ZedBoard的OLED部分电路原理图如下:(需要我们关心的是我用红色椭圆标注出来的3处,一共 ...
- linux内核SPI总线驱动分析(一)(转)
linux内核SPI总线驱动分析(一)(转) 下面有两个大的模块: 一个是SPI总线驱动的分析 (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) ...
- Linux内核中SPI总线驱动分析
本文主要有两个大的模块:一个是SPI总线驱动的分析 (研究了具体实现的过程): 另一个是SPI总线驱动的编写(不用研究具体的实现过程). 1 SPI概述 SPI是英语Serial Peripheral ...
- SPI protocol驱动编写实例
内核版本:3.9.5 Linux中SPI驱动有俩个部分组成:controller驱动,直接和底层硬件打交道,protocol驱动,针对特定的设备,也是我们要做的. 这里只考虑SPI protocol驱 ...
- RT Thread的SPI设备驱动框架的使用以及内部机制分析
注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...
- linux内核SPI总线驱动分析(二)(转)
简而言之,SPI驱动的编写分为: 1.spi_device就构建并注册 在板文件中添加spi_board_info,并在板文件的init函数中调用spi_register_board_info(s3 ...
- zedboard学习(1)OLED驱动显示图像
1. 干点啥?驱动一下上面的屏吧 2. 找个代码研究一下,cat命令用于读取文件(普通文件或设备文件)的内容并进行输出.据说板子已经做好OLED的驱动了,驱动映射为/dev/zed_oled,所以直接 ...
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1. ...
- Linux驱动 - SPI驱动 之三 SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1. ...
随机推荐
- UVA 10100 Longest Match
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=13&p ...
- python3 安装 opencv (转)
Python3支持pip方式自动安装第三方开发包,我们只要打开windows下面的命令行工具,输入如下命令: pip install opencv-python 安装最新的OpenCV3.3开发包 p ...
- 201771010142 张燕《面向对象程序设计(java)》第三周学习总结
实验三 Java基本程序设计(2) 实验时间 2018-9-13 1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3) ...
- sshpass 使用方法
首先下载sshpass并且安装 $ tar -zxvf sshpass-1.06.tar.gz $ cd sshpass-1.06 $ ./configure --prefix=/usr/local/ ...
- 安装php7.2并且整合nginx且分开部署
1.安装php 7.2 2.php配置 3.nginx配置 4.测试 5.报错与解决 6.利用upstream实现负载均衡 1.安装php 7.2 启动容器: liwangdeMacBook-Air: ...
- 1119 Pre- and Post-order Traversals
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...
- Matlab实现《追光者》简谱
MATLAB除了生孩子,其他全都能做系列. 使用MATLAB进行播放<追光者>,纯文本内容哦. Fs = ; load y; sound(y, Fs); 加载的y是哪里来的呢?当然是调用函 ...
- What does git fsck stand for?
fsck -> File System ChecK https://stackoverflow.com/questions/21151945/what-does-git-fsck-stand-f ...
- 夜谈Java类的定义
女孩:谈Java了,好耶? 男孩:夜谈一下,Java的类的定义~ 女孩:那谈Java的类的什么呢? 男孩:类的定义,对象的定义,类中的方法,构造方法,this关键字,方法的重载,Java中的类的访问权 ...
- AndroidStudio制作个人资料界面模块以及SQLite数据库的使用
前言 大家好,给大家带来AndroidStudio制作个人资料界面模块以及SQLite数据库的使用的概述,希望你们喜欢 学习目标 掌握SQLite数据库的使用,能够实现用数据库来保存用户的信息: 学会 ...