SPI Master驱动
参考文件:spi-s3c24xx.c (drivers\spi)
(1) 编写框架
声明spi_master结构体,并在init函数中定义(使用函数定义);exit函数;注册init、exit函数;头文件暂时直接拷贝spi-s3c24xx.c的;
—头文件
参考spi-s3c24xx.c文件中probe函数,写出上述所需创建spi_master的函数;继而写出exit所需的destory函数
—create_ spi_ master函数
—这里还需要自己定义一个s3c_spi_info结构体
—destory_ spi_ master函数
1/27/2018 12:01:55 AM
(2) 实现master结构体下的setup子函数
写setup函数之前,写一个对spi控制器的初始化函数(参考裸板代码),并在create_spi_master函数中调用;
—函数代码
—调用函数
setup函数
—传输模式(手册–>代码)
—频率(手册–>代码)
—所需的变量
1/29/2018 7:32:50 PM
(3) 实现master结构体下的transfer子函数
框架
- 1.1 选中芯片
- 1.2 发数据
1.2.1 发送第一个spi_transfer前先setup;
1.2.2 从spi _ message逐个取出spi_transfer,执行(发送/接收)它;
—补充
1.2.3 唤醒等待的进程;
- 1.3 取消选中
申请中断,并写出相应的中断函数
2.1 在create_spi_master 函数中申请中断(并将irq保存到s3c_spi_info结构体中),并给spi_master_init函数中调用的create_spi_master函数添加传入参数;
2.2 中断函数
—s3c_spi_info结构体新添加的成员,并在s3c2440_spi_transfer函数中进行初始化
最后在destory_spi_master函数中释放中断
2/2/2018 9:45:42 PM
(4) 测试及调试
修改内核目录/drivers/spi下的Makefile,去掉系统自带的spi master主控程序;并重新编译内核(make uImage);
—修改/drivers/spi下的Makefile
—重新编译内核后,并重命名为uImage_3.4.2_nospimaster
上传文件并添加Makefile,进行初次编译;
—修改Makefile
—初次编译,出现一些错误
根据错误提示,修改文件,解决错误;将编译成功的ko文件拷贝到根文件系统目录下;
—修改文件
—编译成功
—将ko文件拷贝到根文件系统目录下
cp spi_master_s3c2440.ko /work/nfs_root/fs_mini_mdev_new
测试
4.1 nfs下载新内核uImage_3.4.2_nospimaster,并用其启动
nfs 30000000 192.168.0.3:/work/nfs_root/uImage_3.4.2_nospimaster bootm 30000000
4.2 加载master驱动,出现段错误;查看文件,并解决错误
—段错误
—按照提示查看create_spi_master函数,查找问题,在文件中添加如图代码;
—再次编译,重新加载驱动,又出现新的段错误;根据提示在s3c2440_spi_irq函数中加入“防误触”代码;
—再次编译,重新加载驱动,加载成功
4.3 再加载之前的oled驱动和flash驱动,进行测试验证
—加载spi_oled驱动,验证
—加载spi_flash驱动,验证
补充:测试完发现,当卸载master驱动后,重新加载master驱动,会出现如图段错误;
—重新加载出现段错误
—修改驱动中的destory_spi_master函数中的代码,解决该错误
2/5/2018 2:38:23 PM