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
原创粉丝点击