您的位置:首页 > 其它

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 driver master 测试