分类: LINUX
2010-04-16 12:25:31
SEP4020 spi 总线驱动的具体实现
************************************************
本文系本站原创,欢迎转载!
转载请注明出处: http:// flysunny.cublog.cn
************************************************
SEP4020 spi 总线驱动的实现是在Linux-
预处理:spi总线驱动需要处理以下的文件
1:spi_sep4020.c(位于linux/driver/spi目录下)是sep4020 spi驱动的核心,并非核心层的核心,我们大部分驱动工作就是完善它
2:regs-spi.h(位于linux/include/asm/arch-sep4020目录下)里面是对4020spi寄存器的相关操作
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-
[root@localhost linux-
进入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.c,regs_spi.c中设置相应的寄存器,具体的sep4020_spi.c,regs_spi.c 这里其实是我们做的最多的地方,这里就不贴出来了,然后编译就可以通过了
我们运行a.out就可以测试我们的驱动了