全部博文(63)
2010年(63)
分类: LINUX
2010-04-17 10:31:36
我们的SEP4020 spi总线驱动在Linux-
以下是是具体的步骤:
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-
[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
[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,
spi_register_board_info(sep4020_spi_board, ARRAY_SIZE(sep4020_spi_board));
第四步:
在sep4020_spi.c,regs_spi.c中设置相应的寄存器,编译通过。
运行a.out就可以测试驱动。