Linux下SPI从设备驱动的编写


SPI(Serial Peripheral Interface) 是一个同步的四线制串行线,用于连接微控制器和传感器、存储器及外围设备。三条信号线持有时钟信号(SCLK,经常在10MHz左右)和并行数据线带有“主出,从进(MOSI)”或是“主进,从出(MISO)”信号。数据交换的时候有四种时钟模式,模式0和模式3是最经常使用的。每个时钟周期将会传递数据进和出。如果没有数据传递的话,时钟将不会循环。

SPI驱动分为两类:

控制器驱动:它们通常内嵌于片上系统处理器,通常既支持主设备,又支持从设备。这些驱动涉及硬件寄存器,可能使用DMA。或它们使用GPIO引脚成为PIO bitbangers。这部分通常会由特定的开发板提供商提供,不用自己写。

协议驱动:它们通过控制器驱动,以SPI连接的方式在主从设备之间传递信息。这部分涉及具体的SPI从设备,通常需要自己编写。

那么特定的目标板如何让Linux 操控SPI设备?下面以AT91SAM9260系列CAN设备驱动为例,Linux内核版本为2.6.19。本文不涉及控制器驱动分析。

board_info提供足够的信息使得系统正常工作而不需要芯片驱动加载

  1. 在arch/arm/mach-at91rm9200/board-at91sam9260.c中有如下代码:   
  2. #include <linux/platform_device.h>   
  3. #include <linux/spi/spi.h>   
  4. …….   
  5. static struct spi_board_info ek_spi_devices[] = {   
  6. /* spi can ,add by mrz */  
  7. #if defined(CONFIG_CAN_MCP2515)     
  8.     {   
  9.         .modalias = "mcp2515",   
  10.         .chip_select = 0,   
  11. //      .controller_data = AT91_PIN_PB3,   
  12.         .irq = AT91_PIN_PC6, //AT91SAM9260_ID_IRQ0,   
  13.         .platform_data = &mcp251x_data,   
  14.         .max_speed_hz = 10 * 1000 * 1000,   
  15.         .bus_num = 1,   
  16.         .mode = 0,   
  17.     }   
  18.     #endif   
  19. };.   
  20. ………   
  21. static void __init ek_board_init(void)   
  22. {   
  23. ……   
  24. /* SPI */  
  25.     at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));   
  26. }  

这样在Linux初始化时候就可以加载SPI CAN驱动。

  • 1
  • 2
  • 下一页

相关内容