SPI_OLED驱动

SPI_OLED驱动

(1)编写单板(设备)信息:构造spi_ board_info结构体

  1. 创建spi_ info_jz2440.c文件。

  2. 编写单板(设备)信息(模仿内核其他文件:acvilon.c等)。

    2.1 包含一些头文件(去掉明显不需要的)

    2.2 编写spi_board_info结构体

    2.3 注册结构体,添加相关协议


    1/5/2018 10:01:56 AM

(2)编写spi_ oled_driver

  1. 创建spi_oled_drv.c文件。

  2. 编写代码

    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

  1. 思路:分析主控驱动文件spi-s3c24xx.c (drivers\spi),修改相关设备文件。

  2. 修改相关文件

    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.1 配置内核,使之支持SPI;

    1.2 上传修改过的相关的内核文件(mach-smdk2440.c和devs.c),并重新编译内核(出现许多错误);

    1.3 修改相关文件错误后(其实就是添加了两个头文件),再重新编译(编译成功)

    —修改

    —编译成功

  2. 编译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. 加载驱动

    3.1 由于前面几节实验,此时需要重新烧写uboot(u-boot-2012.04.01)和内核(新内核uImage_3.4.2_spi)

    注:自动挂载nfs网络文件系统(若需要设置环境参数);内核是nfs下载。
    

    3.2 加载驱动,查看是否已创建设备。

    / # insmod spi_oled_drv.ko 
    / # ls /dev/oled  -l
    


    1/10/2018 1:21:37 PM

编写测试程序及测试

  1. 创建oled_test.c文件

  2. 编写代码

    2.1 编写打印用法函数

    2.2 编写main函数

    —设置标记变量

    —比较传入参数

    —根据置位标记,选择不同的操作(调用驱动中的ioctl函数实现)

    ---这里需要提供Oled打印函数(复制裸板程序中的oled打印函数并修改)
    


    ---添加所需的宏(与驱动程序ioctl函数中使用的一致),包含所需头文件
    

  3. 交叉编译测试程序,并将测试程序拷贝到根文件系统目录下

    arm-linux-gcc -o oled_test oled_test.c

    cp oled_test /work/nfs_root/fs_mini_mdev_new

  4. 测试驱动(内核:上节编译的新内核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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值