首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于S3C2440的Linux SPI驱动移植笔记

基于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);
}
继承事业,薪火相传
返回列表