Nanopi2 Fire 编写SPI驱动
来源:互联网 发布:robotart软件多少钱 编辑:程序博客网 时间:2024/05/17 02:40
惯例先胡扯一同~怎么说呢,Nanopi2这个板子用来开发真的是很磨练人啊。首先自己很菜,然后这个板子资料还不算太多,热度也少,玩的人深度也不够,造成了自己开发的难度激增,SPI这个最基本的框架弄了一下午才弄出了个大概,照例放出给我启示很大的两篇博文:
http://blog.csdn.net/yuanlulu/article/details/6318165
http://blog.csdn.net/yuanlulu/article/details/6320740
代码中很多都是照搬过去的,然后遇到问题就解决问题……毕竟驱动这一块本身研究的人就不多,深入浅出还带代码的的确很难找……
得,胡扯时间结束,下面开始进入正题。
代码:
/*首先是常用的头文件*/#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/gpio.h>#include <linux/delay.h>#include <linux/spi/spi.h>#include <linux/spi/spidev.h>#include <linux/irq.h>#include <linux/interrupt.h>#include <mach/platform.h>//包含了这个,NXP写的那些宏定义就都能用了
struct NPD_platform_data{ char model[10];//测试用相关数据 };static struct NPD_platform_data NPD_data= { .model = "TEST",};static struct spi_board_info initdata = { .modalias = "NPD", .platform_data = &NPD_data, .mode = SPI_MODE_0,//最常用的模式 .irq = IRQ_GPIO_C_START+7,//这个稍微说一下,这个的定义在 //linux-3.4.y/arch/arm/mach-s5p4418/include/mach/s5p4418_irq.h //中,里面写了所有的IRQ中断号,代码截取如下~ .max_speed_hz = 10000000, .bus_num = 0, //spi0 .chip_select = 1, //spi0.1,这里换成0会报错,ssp-pl022 ssp-pl022.0: chipselect 0 already in use,个人认为将Device Drivers->SPI support ->User mode SPI device driver support 关闭会解决这个问题,因为需要重新弄内核就没试};
/* * GPIO Interrupt Number 160 (64~223) */#define IRQ_GPIO_START IRQ_PHY_MAX_COUNT#define IRQ_GPIO_END (IRQ_GPIO_START + 32 * 5) // Group: A,B,C,D,E#define IRQ_GPIO_A_START (IRQ_GPIO_START + PAD_GPIO_A)#define IRQ_GPIO_B_START (IRQ_GPIO_START + PAD_GPIO_B)#define IRQ_GPIO_C_START (IRQ_GPIO_START + PAD_GPIO_C)#define IRQ_GPIO_D_START (IRQ_GPIO_START + PAD_GPIO_D)#define IRQ_GPIO_E_START (IRQ_GPIO_START + PAD_GPIO_E)
static int Init(void){ struct spi_master *spi_mast = 0; spi_mast = spi_busnum_to_master(0);//这个将SPIx换成控制器的spi_master,未自己编译内核开启SPI2将0换成2会报错 if(!spi_mast) { printk("cannot get spi_master!\n"); return; } printk("spi_master Get\n"); dev = spi_new_device(spi_mast,&initdata); if(dev) { dev->bits_per_word = 8;//这个是因为spi_new_device不会修改perword,我们自己修改后就可以直接使用dev来进行通信了 printk("spi_new_device OK\n"); } else { printk("spi_new_device failed\n"); } printk("Online\n"); return 0;}
static void Exit(void){ printk("Offline\n"); if(dev) { spi_unregister_device(dev);//注销 }}
基本就这些,结果其实很喜闻乐见:
[ 345.296000] spi_master Get
[ 345.300000] SSP Target Frequency is: 10000000, Effective Frequency is 8333333
[ 345.308000] spi_new_device OK
[ 345.312000] Online
0 0
- Nanopi2 Fire 编写SPI驱动
- SPI驱动编写
- NanoPi2 fire 试用体验(一)
- SPI protocol 驱动编写 Part 1
- 针对nanopi2的hello word 驱动
- Linux下SPI从设备驱动的编写
- linux内核SPI总线驱动简单编写测试
- linux3.2下adt7320的spi驱动编写
- Linux下SPI从设备驱动的编写
- esp32的spi驱动的编写遇到的问题
- Linux下SPI从设备驱动的编写
- spi驱动
- SPI驱动
- SPI驱动
- spi驱动
- spi驱动
- SPI驱动
- 基于NanoPi2的Linux3.4内核GPIO驱动
- fragment更新activity中的界面
- VBA 格式化输出XML(UTF-8无BOM编码)
- Hibernate hibernate.hbm2ddl.import_files中文乱码问题解决
- CSS预处理器SASS | LESS等简介
- select 2级联动和checkbox全选框联动
- Nanopi2 Fire 编写SPI驱动
- EF映射——linq to Entity ,不支持方法 get_item(int 32) 无法转换为存储表达式
- Linux多线程编程
- 如何在centos6.x 下建立swap文件
- [leetcode] 40. Combination Sum II
- Bootstrap学习小结
- 深度使用react-native的热更新能力,必须知道的一个shell命令
- [leetcode] 236. Lowest Common Ancestor of a Binary Tree
- 启动Activity时的方法调用(应用层)(MVC模式)