1、核心自帶的SPI相關的驅動檔案
項目中有CPU與FPGA進行通信,用到SPI接口:
SPI頭檔案在:
linux-kernel/include/linux/spi.h
SPI實作在:
linux-kernel/drivers/spi/spi.c omap2_mcspi.c spidev.c
DVS8168開發闆在以下檔案中初始化SPI:
linux-kernel/arch/arm/mach-omap2/board-ti8168evm.c
上述檔案中有:
1 const struct flash_platform_data ti816x_spi_flash =
2 {
3 .type = "w25x32",
4 .name = "spi_flash",
5 .parts = ti816x_spi_partitions,
6 .nr_parts = ARRAY_SIZE(ti816x_spi_partitions),
7 };
8
9 struct spi_board_info __initdata ti816x_spi_slave_info[] =
10 {
11 {
12 .modalias = "m25p80",
13 .platform_data = &ti816x_spi_flash,
14 .irq = -1,
15 .max_speed_hz = 75000000,
16 .bus_num = 1,
17 .chip_select = 0,
18 },
19 };
20
21 static void __init ti816x_spi_init(void)
22 {
23 spi_register_board_info(ti816x_spi_slave_info,
24 ARRAY_SIZE(ti816x_spi_slave_info));
25 }
修改board-ti8168evm.c 初始化我們自己的SPI裝置,如下:
1 // Dragon add
2 struct spi_board_info __initdata fpga_spi_slave_info[] = {
3 {
4 .modalias = "spidev",
5 .max_speed_hz = 48000000, // 48 Mbps
6 .bus_num = 1,
7 .chip_select = 2,
8 .mode = SPI_MODE_1,
9 },
10 };
11
12 // Dragon modified
13 static void __init ti816x_spi_init(void)
14 {
15 spi_register_board_info(fpga_spi_slave_info,
16 ARRAY_SIZE(fpga_spi_slave_info));
17 }
2、重新編譯核心,同時選擇生成spi裝置驅動
$ make menuconfig CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm
(1)Device drivers -> Memory tech... -> Self-contained --> 取消 support most spi Flash
影響:取消檔案(/drivers/mtd/devices/mtd_m25p80.c)
(2)D-evice drivers --> SPI Support --> 勾選 Utilities & Mcspi driver & User mode SPI
影響:加入檔案(/drivers/spi/spi_bitbang.c /drivers/spi/omap2_mcspi.c /drivers/spi/spidev.c)
linux-kenel/drivers/spidev.c 實作使用者态spi裝置驅動的功能
3、編譯核心自帶spi應用程式,驗證SPI功能(注意MISO要與MOSI相連,以實作回環測試)如下:
linux-kenel\Documentation\spi\spidev_test.c
示波器截圖,黃色為SCLK,藍色為MOSI
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1cDN2cDM0ATMxATOxgTMvw1MwUTMwIzLcJTN0UjM08CX1EDMyc2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
發送資料與接收資料相同,則說明SPI通信成功!