Chinaunix首页 | 论坛 | 博客
  • 博客访问: 276636
  • 博文数量: 91
  • 博客积分: 2105
  • 博客等级: 大尉
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-14 19:30
文章分类
文章存档

2011年(11)

2010年(64)

2009年(16)

我的朋友

分类: LINUX

2010-04-16 12:25:31

SEP4020 spi 总线驱动的具体实现

************************************************

本文系本站原创,欢迎转载!

转载请注明出处: http:// flysunny.cublog.cn

************************************************

 

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总线驱动需要处理以下的文件

1spi_sep4020.c(位于linux/driver/spi目录下)是sep4020 spi驱动的核心,并非核心层的核心,我们大部分驱动工作就是完善它

2regs-spi.h(位于linux/include/asm/arch-sep4020目录下)里面是对4020spi寄存器的相关操作

3spi.h(位于linux/ arch/arm/mach-sep4020/include/mach/spi.h) 是里面定义了sep4020_spi_info 等信息

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

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

6mm.c(位于linux/ arch/arm/mach-sep4020目录下) ,我用的是用静态的获得地址映射

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

第一步:把上面得spi_sep4020.cregs-spi.hspi.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

#include

#include

#include

 

 

 

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

 *         spi  add  by   liyu

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

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) 函数中添加

 

 

/*spi add by liyu */

sep_device_spi.dev.platform_data= &sep4020_spi_platdata;

spi_register_board_info(sep4020_spi_board, ARRAY_SIZE(sep4020_spi_board));

 

 

第四部:

 对应我们的4020,我们要在sep4020_spi.cregs_spi.c中设置相应的寄存器,具体的sep4020_spi.cregs_spi.c 这里其实是我们做的最多的地方,这里就不贴出来了,然后编译就可以通过了

 

我们运行a.out就可以测试我们的驱动了

 

 

 

阅读(753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~