基于S3C2440的Linux SPI驱动移植笔记
- UID
- 1029342
- 性别
- 男
|
基于S3C2440的Linux SPI驱动移植笔记
Linux内核版本:2.6.30.4
测试平台:EmbedSky TQ2440
在2.6.30.4内核源码中,已经给出了S3C2440的SPI驱动,但是TQ2440并没有启用这个驱动,因此要在arch/arm/mach-s3c2440/mach-tq2440.c中加入SPI的支持。网上参考的文章只将S3C2440的SPI0进行了配置,如果需要使用到两个SPIMaster,就需要进行进一步配置。首先增加如下结构定义:
static struct spi_board_info s3c2410_spi0_board[] = {
[0] = {
.modalias = "spidev",
.bus_num = 0,
.chip_select = 0,
.irq = IRQ_EINT10,
.max_speed_hz = 500*1000,
},
};
static struct s3c2410_spi_info s3c2410_spi0_platdata = {
.pin_cs = S3C2410_GPG2,
.num_cs = 1,
.bus_num = 0,
};
static struct spi_board_info s3c2410_spi1_board[] = {
[0] = {
.modalias = "spidev",
.bus_num = 1,
.chip_select = 0,
.irq = IRQ_EINT11,
.max_speed_hz = 500*1000,
},
};
static struct s3c2410_spi_info s3c2410_spi1_platdata = {
.pin_cs = S3C2410_GPG3,
.num_cs = 1,
.bus_num = 1,
};
这几个结构与前述参考内容不太一样,主要对pin_cs进行了修改,将其改回S3C2440的两个nSS脚。另外,spi1的配置需要将bus_num改为1,否则后面装载驱动会出错,另外,将两个中断源改为相应的nSS脚占用的外部中断号,但尚未验证其不同选择对驱动的影响。
然后,在tq2440_devices中增加下面两行:
&s3c_device_spi0,
&s3c_device_spi1,
这两个结构体在内核源码arch/arm/plat-s3c24xx/devs.c中定义,主要负责将S3C2440的SPI控制寄存器及中断资源进行描述。
在tq2440_machine_init函数中增加SPI设备注册代码:
static void __init tq2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&tq2440_fb_info);
s3c_i2c0_set_platdata(NULL);
platform_add_devices(tq2440_devices,ARRAY_SIZE(tq2440_devices));
EmbedSky_machine_init();
s3c_device_spi0.dev.platform_data=&s3c2410_spi0_platdata;
spi_register_board_info(s3c2410_spi0_board,ARRAY_SIZE(s3c2410_spi0_board));
s3c_device_spi1.dev.platform_data=&s3c2410_spi1_platdata;
spi_register_board_info(s3c2410_spi1_board,ARRAY_SIZE(s3c2410_spi1_board));
s3c2410_gpio_setpin(S3C2410_GPG12, 0);
s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPIO_OUTPUT);
s3c24xx_udc_set_platdata(&EmbedSky_udc_cfg);
} |
|
|
|
|
|