1. 程式人生 > >mini2440 SPI驅動移植(轉)

mini2440 SPI驅動移植(轉)

按照下面帖子的方法,本人試驗成功,只需按照下面步驟進行就行了。

原帖地址: http://blog.csdn.net/lxmky/article/details/6858322

注:原文最後短接的MISO和MOSI指的是SPI1的,區別於SPI0

mini2440中,SPI0和SPI1的四個功能引腳均接有上拉電阻10K到3.3V。

引腳

SPICLK0

SPIMISO0

SPIMOSI0

nSS0/GPG2/EINT10

複用功能

GPE13

GPE11

GPE12

Only for slave mode P23

CON4 引腳

27

25

26

28

SPI1同時接到開發板上的按鍵

引腳

SPICLK1

SPIMISO1

SPIMOSI1

nSS1/GPG3/EINT11

複用功能

GPG7/EINT15

GPG5/EINT13

GPG6/EINT14

Only for slave mode P23

CON4 引腳

21

19

20

18



最近專案需要,需要在mini2440上移植SPI驅動,板子需要驅動SPI裝置,上網找了很多資源,但是很多都是有問題,最終在基本理解驅動結構的前提下,將SPI驅動順利移植到mini2440。

,我使用的核心版本是2.6.32.2,這個版本和2.6。29不一樣,網上很多版本都是關於2.6.29,如果完全按照網上步驟,編譯會出現問題,我做的步驟如下:

1,在Linux Source Code中修改arch/arm/mach-s3c2440/mach-mini2440.c檔案,加入標頭檔案:

[cpp]  view plain copy
  1. #include <linux/spi/spi.h>  
  2. #include <../mach-s3c2410/include/mach/spi.h>  
然後加入如下程式碼:

[cpp]  view plain copy
  1. static struct spi_board_info s3c2410_spi0_board[] =  
  2. {  
  3.         [0] = {  
  4.                 .modalias = "spidev",  
  5.                 .bus_num = 0,  
  6.                 .chip_select = 0,  
  7.                 .irq = IRQ_EINT9,  
  8.                 .max_speed_hz = 500 * 1000,  
  9.                 }  
  10. };  
  11.   
  12. static struct s3c2410_spi_info s3c2410_spi0_platdata = {  
  13.         .pin_cs = S3C2410_GPG(2),  
  14.         .num_cs = 1,  
  15.         .bus_num = 0,  
  16.         .gpio_setup = s3c24xx_spi_gpiocfg_bus0_gpe11_12_13,  
  17. };  
  18.   
  19. static struct spi_board_info s3c2410_spi1_board[] =  
  20. {  
  21.         [0] = {  
  22.                 .modalias = "spidev",  
  23.                 .bus_num = 1,  
  24.                 .chip_select = 0,  
  25.                 .irq = IRQ_EINT2,  
  26.                 .max_speed_hz = 500 * 1000,  
  27.                 }  
  28. };  
  29.   
  30.   
  31. static struct s3c2410_spi_info s3c2410_spi1_platdata = {  
  32.         .pin_cs = S3C2410_GPG(3),  
  33.         .num_cs = 1,  
  34.         .bus_num = 1,  
  35.         .gpio_setup = s3c24xx_spi_gpiocfg_bus1_gpg5_6_7,  
  36. };  
這裡需要了解驅動架構,其中移植過程中容易出問題的地方時S3C2410_GPG(2)和S3C2410_GPG(3)兩處地方,網上一般給的原始碼是S3C2410_GPG2,這在2.6.29中可行,但是在2.6.32原始碼中沒有定義S3C2410_GPG2巨集定義,要使用S3C2410_GPG(2)巨集定義。

在mini2440_devices[]平臺數組中新增如下程式碼:

[cpp]  view plain copy
  1. &s3c_device_spi0,  
  2. &s3c_device_spi1,  
最後在mini2440_machine_init函式中加入如下程式碼:

[cpp]  view plain copy
  1. s3c_device_spi0.dev.platform_data= &s3c2410_spi0_platdata;  
  2. spi_register_board_info(s3c2410_spi0_board, ARRAY_SIZE(s3c2410_spi0_board));  
  3. s3c_device_spi1.dev.platform_data= &s3c2410_spi1_platdata;  
  4. spi_register_board_info(s3c2410_spi1_board, ARRAY_SIZE(s3c2410_spi1_board));  

最後需要修改arch/arm/plat-s3c24xx/KConfig檔案

找到如下程式碼段:

[cpp]  view plain copy
  1. config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13  
  2.         bool   
  3.         help  
  4.           SPI GPIO configuration code for BUS0 when connected to  
  5.           GPE11, GPE12 and GPE13.  
  6.   
  7. config S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7  
  8.         bool   
  9.         help  
  10.           SPI GPIO configuration code for BUS 1 when connected to  
  11.           GPG5, GPG6 and GPG7.  

修改為 [cpp]  view plain copy
  1. config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13  
  2.         bool "S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13"  
  3.         help  
  4.           SPI GPIO configuration code for BUS0 when connected to  
  5.           GPE11, GPE12 and GPE13.  
  6.   
  7. config S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7  
  8.         bool "S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7"  
  9.         help  
  10.           SPI GPIO configuration code for BUS 1 when connected to  
  11.           GPG5, GPG6 and GPG7.  
最後我們配置編譯檔案:

[cpp]  view plain copy
  1. make menuconfig  
圖1


圖2


圖3

圖4


圖5


最後編譯核心

[cpp]  view plain copy
  1. make zImage  
將編譯好的核心匯入開發板,並且編譯Linux Source自帶的測試程式,在Documentation/spi下,修改spidev_test.c檔案,將device name改為/dev/spidev1.0

交叉編譯:

[cpp]  view plain copy
  1. arm-linux-gcc -I ~/linux-2.6.32.2/include/ spidev_test.c  
將編譯好的檔案下載到開發板上,並且將開發板的SPI MOI和MIO短接,也就是讓SPI自己傳送自己接收,執行檔案,我們看到如下結果:

[cpp]  view plain copy
  1. FF FF FF FF FF FF  
  2. 40 00 00 00 00 95  
  3. FF FF FF FF FF FF  
  4. FF FF FF FF FF FF  
  5. FF FF FF FF FF FF  
  6. DE AD BE EF BA AD  
  7. F0 0D  
說明驅動移植成功。


總結:這裡敘述的是驅動移植詳細過程,程式碼的具體含義以及開發板的針腳對應圖需要自己去查閱相關資料,這裡不再詳述。

地址:http://blog.csdn.net/lxmky/article/details/6858322