SEP4020 spi 总线驱动的实现

 

我们的SEP4020 spi总线驱动在Linux-2.6.27内核中实现,内核里的测试程序spidev_test.c(位于Linux/documentation/spi)经交叉编译(交叉编译的操作:进入到Linux/documentation/spi 目录下[root@localhost spi]#arm-linux-gcc-I/linux-2.6.27/include spidev_test.c)后生成a.out可执行程序,测试显示数据能够正确传输。

以下是是具体的步骤:

 

  spi总线驱动需要处理以下的文件:

1:spi_sep4020.c(位于linux/driver/spi目录下)

   sep4020 spi驱动的核心,并非核心层的核心,我们的spi驱动的具体实现就依靠它了。

2:regs-spi.h(位于linux/include/asm/arch-sep4020目录下)

   里面针对sep4020的spi定义了相应的处理宏,调试阶段也可以直接操作寄存器。

3:spi.h(位于linux/ arch/arm/mach-sep4020/include/mach/spi.h) 是里面定义了sep4020_spi_info结构体。

4:4020.c(位于linux/ arch/arm/mach-sep4020目录下),里面要注册spi platform,并有spi一些信息。

5:clock.c(位于linux/ arch/arm/mach-sep4020目录下),里面需要增加spi模块的时钟支持。

6:mm.c(位于linux/ arch/arm/mach-sep4020目录下) ,用静态地址映射。

7:hardware.h(位于linux/ arch/arm/mach-sep4020/include/mach),里面是4020的许多信息了,这里已经设好了,到0718需要设置的。

 

 

第一步:把spi_sep4020.c,regs-spi.h,spi.h 放到对应的文件夹下 。

 

第二步:添加spi总线驱动到内核 。

进入到linux/driver/spi目录下,打开makefile 和kconfig文件,

kconfig(第167行)中添加如下内容:

config SPI_SEP4020

      tristate "Prochip SEP4020 series SPI"

  depends on ARCH_SEP4020 && EXPERIMENTAL

select SPI_BITBANG

  help

    SPI driver for Prochip SEP4020 series ARM SoCs

makefile(第29行)添加如下内容:

obj-$(CONFIG_SPI_SEP4020)         += spi_sep4020.o

进入终端,

[root@localhost ~]# cd /linux-2.6.27

[root@localhost linux-2.6.27]# make menuconfig

进入Device Drivers  --->  SPI support  ---> 

spi support 编进内核(y), [*] SPI support,并进入spi support

-> Device Drivers

--- SPI support                                                 

    [*]   Debug support for SPI drivers                             

          *** SPI Master Controller Drivers ***                     

    -*-   Bitbanging SPI master                                     

    <*>   Prochip SEP4020 series SPI                                 

            *** SPI Protocol Masters ***                              

    < >   SPI EEPROMs from most vendors                              

    <*>   User mode SPI device driver support                       

    < >   Infineon TLE62X0 (for power switching)

设置完成保存。

 

 第三步:修改linux/ arch/arm/mach-sep4020目录下的4020.c 。

 增加:

   #include <asm/arch-sep4020/regs-spi.h>

   #include <mach/spi.h>

   #include <linux/spi/spi.h>

   #include <linux/spi/spidev.h>

 

 static struct spi_board_info sep4020_spi_board[] = {

        [0] = {

                .modalias = "spidev",

                .bus_num        = 0, 

                .chip_select        = 0,

                .irq = INTSRC_EXTINT9,

                .max_speed_hz         = 500*1000,

        },

};

 

static struct sep4020_spi_info sep4020_spi_platdata = {

        .pin_cs = SEP4020_GPD2_DATA,

        .num_cs = 1,

        .bus_num = 0,

};

 

 

 

static struct resource sep_spi_resource[] = {

       [0] = {

              .start = SSI_BASE_V,

              .end   = SSI_BASE_V + SZ_4K - 1,

              .flags = IORESOURCE_MEM,

       },

       [1] = {

              .start = INTSRC_SSI,

              .end   = INTSRC_SSI,

              .flags = IORESOURCE_IRQ,

       }

 

};

 

static u64 sep_device_spi_dmamask = 0xffffffffUL;

 

struct platform_device sep_device_spi = {

       .name              = "sep4020-spi",

       .id            = 0,

       .num_resources     = ARRAY_SIZE(sep_spi_resource),

       .resource         = sep_spi_resource,

        .dev              = {

                .dma_mask = &sep_device_spi_dmamask,

                .coherent_dma_mask = 0xffffffffUL,

                                    .platform_data = &sep4020_spi_platdata,

        }

};

EXPORT_SYMBOL(sep_device_spi);

/* --------------------------------------------------------------------*/

 

 

static struct platform_device *devices[] __initdata中添加  &sep_device_spi,

 

 在void __init sep4020_init(void) 函数中添加

 sep_device_spi.dev.platform_data= &sep4020_spi_platdata;

spi_register_board_info(sep4020_spi_board, ARRAY_SIZE(sep4020_spi_board));

 

 

第四步:

 在sep4020_spi.c,regs_spi.c中设置相应的寄存器,编译通过。

 

运行a.out就可以测试驱动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sina33备份的文件20150609_2100.7z 全志a33要生成设备节点需要改动的地方: sina33打开spidev0.0的步骤.txt (全志a33下生成设备节点/dev/spidev0.0) 0、 S:\lichee\tools\pack\chips\sun8iw5p1\configs\default\env.cfg bootdelay=0 修改为 bootdelay=3 方便按 enter 进u-boot,进行调试。 1、 rootroot@rootroot-E400:~/wyb/sina33/lichee/linux-3.4$ rootroot@rootroot-E400:~/wyb/sina33/lichee/linux-3.4$ make ARCH=arm menuconfig (sina33的原始menuconfig) Device Drivers ---> [*] SPI support ---> --- SPI support [ ] Debug support for SPI drivers *** SPI Master Controller Drivers *** < > Altera SPI Controller < > Utilities for Bitbanging SPI masters < > GPIO-based bitbanging SPI Master < > OpenCores tiny SPI <*> SUNXI SPI Controller < > Xilinx SPI controller common module < > DesignWare SPI controller core support *** SPI Protocol Masters *** < > User mode SPI device driver support < > Infineon TLE62X0 (for power switching) (sina33的原始menuconfig) Device Drivers ---> [*] SPI support ---> --- SPI support [ ] Debug support for SPI drivers *** SPI Master Controller Drivers *** < > Altera SPI Controller < > Utilities for Bitbanging SPI masters < > GPIO-based bitbanging SPI Master < > OpenCores tiny SPI <*> SUNXI SPI Controller < > Xilinx SPI controller common module < > DesignWare SPI controller core support *** SPI Protocol Masters *** (需要打开这里才能够生成设备节点:/dev/spidev0.0) <*> User mode SPI device driver support < > Infineon TLE62X0 (for power switching) 2、 S:\lichee\tools\pack\chips\sun8iw5p1\configs\y3\sys_config.fex ;---------------------------------------------------------------------------------- ;SPI controller configuration ;spi_used = SPIx enable ;spi_cs_bitmap = SPI bit mapping ;---------------------------------------------------------------------------------- [spi0] spi_used = 1 spi_cs_bitmap = 1 spi_mosi = port:PC00<3><default><default><default> spi_miso = port:PC01<3><default><default><de

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值