Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308036
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: 嵌入式

2011-11-21 14:23:51

基于S3C2440 Linux2.30.4 SPI驱动移植全过程  

2011-04-08 16:02:15|  分类: 嵌入式开发 |  标签: |字号 

一、环境

    硬件:s3c2440

    内核:Linux2.30.4

    交叉编译工具:EABI4.3.3

    开发环境:rhel5.5

二、移植

  1.修改arch/arm/mach-s3c2440/mach-mini2440.c文件:  
 

a.加入头文件

  #include <../mach-s3c2410/include/mach/spi.h>
  #include

  b.加入接口结构

/* SPI */
static struct spi_board_info s3c2410_spi0_board[] = {
        [0] = {
                .modalias = "spidev",
                .bus_num= 0,
                .chip_select= 0,
               /* s3c2410_spi0_platdata.num_cs */
                .irq = IRQ_EINT9,
                .max_speed_hz= 96*1000*1000,
        },
};

static struct s3c2410_spi_info s3c2410_spi0_platdata = {
        .pin_cs = S3C2410_GPG2,
        .num_cs = 1,
        .bus_num = 0,
        .gpio_setup=s3c24xx_spi_gpiocfg_bus0_gpe11_12_13,
};


c.加入设备

static struct platform_device *tq2440_devices[] __initdata = {
        &s3c_device_usb,
        &s3c_device_lcd,
        &s3c_device_wdt,
        &s3c_device_i2c0,
        &s3c_device_iis,
        &s3c_device_rtc,
#ifdef CONFIG_DM9000
        &s3c_device_dm9000,
#endif
        &s3c_device_usbgadget,
        &s3c_device_uda134x,

        &s3c_device_spi0,                 //注意在结构体中的位置,否则会出现编译错误
        //&s3c_device_spi1, //for spi1
};

d.注册设备

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();
        /*SPI*/
        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; //for spi1
        //spi_register_board_info(s3c2410_spi1_board, ARRAY_SIZE(s3c2410_spi1_board)); //for spi1

        s3c2410_gpio_setpin(S3C2410_GPG12, 0);
        s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPIO_OUTPUT);
        s3c24xx_udc_set_platdata(&EmbedSky_udc_cfg);
}

2.修改Kconfig

打开arch/arm/plat-s3c24XX/Kconfig
找到
////////////

config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13
bool
help
SPI GPIO configuration code for BUS0 when connected to
GPE11, GPE12 and GPE13.

config S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7
bool
help
SPI GPIO configuration code for BUS 1 when connected to
GPG5, GPG6 and GPG7.

修改为
# SPI default pin configuration code

config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13
        bool "S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13"
        help
          SPI GPIO configuration code for BUS0 when connected to
          GPE11, GPE12 and GPE13.

config S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7
        bool "S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7"
        help
          SPI GPIO configuration code for BUS 1 when connected to
          GPG5, GPG6 and GPG7.


3.编译内核

#make menuconfig


 System Type  ---> 

  [*] S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13                                                                              

   [ ] S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7

 

  Device Drivers  --->

                          [*] SPI support  --->  

                                                      --- SPI support                                                                                                         
                                                     *** SPI Master Controller Drivers ***                                                                         
                                                     -*-   Utilities for Bitbanging SPI masters           

                                                     <*>   GPIO-based bitbanging SPI Master      

                                                      <*>   Samsung S3C24XX series SPI                                                      

                                                      <*>   Samsung S3C24XX series SPI by GPIO                                           
                                                     *** SPI Protocol Masters ***   

                                                     <*>   User mode SPI device driver support 

                                                     < >   Infineon TLE62X0 (for power switching)  

保存

#make zImage

4.测试

../Documentation/spi

arm-linux-gcc -I/root/linux-2.6.30.4/include spidev_test.c

 

 后会生成a.out的spi测试程序;
拷入文件系统运行可看到结果(将MISO和MOSI短接)

5.结果

./a.out
spi mode: 0
bits per word: 8
max speed: 96000000 Hz (96000 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D

测试结果正确。

用示波器查看波形t=20ns*2 并且数据波形正确

参考:

          
          

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

zhanglong712012-02-16 12:42:55

试了一下, 成功了.