SPI_OLED驱动
2018-01-17 19:00
316 查看
SPI_OLED驱动
(1)编写单板(设备)信息:构造spi_ board_info结构体
创建spi_ info_jz2440.c文件。编写单板(设备)信息(模仿内核其他文件:acvilon.c等)。
2.1 包含一些头文件(去掉明显不需要的)
2.2 编写spi_board_info结构体
2.3 注册结构体,添加相关协议
1/5/2018 10:01:56 AM
(2)编写spi_ oled_driver
创建spi_oled_drv.c文件。编写代码
2.1 创建一个spi_driver结构体(参考其他文件),并在初始化(入口)函数中注册该结构体;
2.2 出口函数;并修饰入口、出口函数;添加相关协议;头文件;
2.3 实现spi_driver结构体下的probe函数和remove函数;
2.3.1 probe函数(注册一个file_operations结构体) 在外部创建一个file_operations结构体,并在probe函数中注册;
2.3.2 remove函数(注销)
2.4 实现file_operation结构体下的ioctl、write函数;
2.4.1 ioctl函数(用switch实现选择oled初始化、清屏、清页、设置位置) a. 拷贝之前裸板程序oled.c文件中oled初始化、清屏、清页、设置位置等函数,并作适当修改。 b. 需要修改的函数(这里已不需要片选函数):Oled_Set_DC、Oledwritecmd、Oledwritedat。 ---Oled_Set_DC函数
---Oledwritecmd和Oledwritedat
---oled初始化、清屏、清页、设置位置等函数(和裸板程序一样,位修改) ---ioctl函数调用
2.4.2 write函数(主要靠spi_write函数实现)
补充:
—在probe函数中添加对片选引脚的设置
1/8/2018 9:24:46 AM
(3)修改内核中spi_master
思路:分析主控驱动文件spi-s3c24xx.c (drivers\spi),修改相关设备文件。修改相关文件
2.1 添加设备(mach-smdk2440.c)
—(分析)主控文件spi-s3c24xx.c中已经注册了平台驱动s3c24xx_spi_driver,故需要在相关文件中注册相同名字的平台设备
—(添加)搜索s3c2410-spi,找到devs.c文件,并模仿其他设备添加的方式,找到添加设备的文件–这里在mach-smdk2440.c文件中添加
2.2 添加平台设备数据(devs.c: arch\arm\plat-samsung)
—(分析)主控文件spi-s3c24xx.c中probe函数中要使用平台设备下的platform_data,故需要在平台设备文件中添加该部分
—(添加)在devs.c文件中的spi设备中添加该部分
—(分析)由于主控文件中probe函数使用到了platform_data下的num_cs、bus_num、set_cs,故platform_data中至少包含该三项
—(修改)在devs.c文件中的spi设备中的平台数据中添加该三部分
其中set_cs部分是由于逻辑原因(3.4.2内核),需模仿原函数,复制到设备文件并稍加修改(如下图)。
1/9/2018 7:54:33 PM
(4)编译文件
编译主控驱动相关的文件。1.1 配置内核,使之支持SPI;
1.2 上传修改过的相关的内核文件(mach-smdk2440.c和devs.c),并重新编译内核(出现许多错误);
1.3 修改相关文件错误后(其实就是添加了两个头文件),再重新编译(编译成功)
—修改
—编译成功
编译oled驱动。
2.1 上传之前编写的驱动文件(spi_ oled_ drv.c)和单板信息文件(spi_ info_jz2440.c),并添加Makefile文件后,编译驱动(出现许多错误);
—添加Makefile
—编译错误
2.2 修改相关文件,解决错误
—spi_ info_jz2440.c修改部分
—spi_ oled_ drv.c修改部分
—再次编译驱动,出现一个警告
—该警告是由于未将spi_ info_jz2440.c中使用的内核函数spi_register_board_info未从内核中导出,故需要将spi_ info_jz2440.c编译进内核
a. 复制文件到内核相应目录:cp spi_info_jz2440.c /work/system/linux-3.4.2/drivers/spi/ b. 修改目录下Makefile,添加该文件;
—修改驱动所在目录下的Makefile(去掉编译spi_info_jz2440文件)
— 重新编译内核,重新编译驱动,并复制新内核和新驱动到相应目录
cp arch/arm/boot/uImage /work/nfs_root/uImage_3.4.2_spi
cp spi_oled_drv.ko /work/nfs_root/fs_mini_mdev_new
加载驱动
3.1 由于前面几节实验,此时需要重新烧写uboot(u-boot-2012.04.01)和内核(新内核uImage_3.4.2_spi)
<
4000
pre>
注:自动挂载nfs网络文件系统(若需要设置环境参数);内核是nfs下载。
3.2 加载驱动,查看是否已创建设备。
/ # insmod spi_oled_drv.ko / # ls /dev/oled -l
1/10/2018 1:21:37 PM
编写测试程序及测试
创建oled_test.c文件编写代码
2.1 编写打印用法函数
2.2 编写main函数
—设置标记变量
—比较传入参数
—根据置位标记,选择不同的操作(调用驱动中的ioctl函数实现)
---这里需要提供Oled打印函数(复制裸板程序中的oled打印函数并修改)
---添加所需的宏(与驱动程序ioctl函数中使用的一致),包含所需头文件
交叉编译测试程序,并将测试程序拷贝到根文件系统目录下
arm-linux-gcc -o oled_test oled_test.c
cp oled_test /work/nfs_root/fs_mini_mdev_new
测试驱动(内核:上节编译的新内核uImage_3.4.2_spi)
—下载内核并用新内核启动
nfs 30000000 192.168.0.3:/work/nfs_root/uImage_3.4.2_spi
—测试(如图)
insmod spi_oled_drv.ko(加载驱动)
ls /dev/oled(查看设备)
./oled_test(测试)
./oled_test init
./oled_test 0 0 tianpeng@qq.com
1/17/2018 2:45:47 PM
相关文章推荐
- SPI驱动模型---Oled
- 51 软件模拟SPI驱动OLED
- STM32硬件SPI驱动0.96寸的OLED
- 基于TQ2440的SPI驱动学习(OLED)
- FPGA驱动OLED动态显示(Verilog代码)——SPI写操作
- spi子系统之驱动SSD1306 OLED
- Linux内核调用SPI平台级驱动_实现OLED的显示功能
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- linux内核SPI总线驱动分析(一)
- OK6410A 之 SPI 驱动 测试 步骤
- STM32 SPI驱动TFT LCD
- 关于Marvell8686 wifi 的2440 SPI 接口的驱动 学习
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析
- davinci平台的spi驱动框架
- FreeScale mpc8xxx + vxWorks平台下spi flash驱动开发三步走
- PYB Nano驱动OLED显示
- 直接访问树莓派的SPI,不通过驱动
- Linux SPI总线设备驱动模型详解
- linux内核SPI总线驱动简单编写测试
- Linux SPI 子系统驱动笔记之Linux spi设备驱动与SPI控制器驱动的匹配问题