Linux下的SPI驅動總的來講分紅兩大部分,一部分與SPI控制器相關,這種東西通常是不須要咱們這種芯片使用者來編寫的;而另外一部分與使用SPI總線接入的設備相關,這些東西就要咱們本身動手了。時間有限,今天就先簡單說說怎樣爲BeagleBone平臺添加SPI支持。
首先,我是用的是BuildRoot搭建的整個開發環境,而BuildRoot中使用的TI提供的LinuxPSP(板級支持包啦)。像掛接在SPI總線上的東西,均可以算是Hard-wired的,是故在系統初始化的時候一併弄好,而且再也不變更就顯得很合理了……好吧,至少TI與寫SPI驅動的認識這麼認爲的,因此這裏咱們若是想要添加新的SPI設備只能修改內核代碼!其實不是很難……
根據PSP文檔,修改"board-am335xevm.c"文件。首先,固然要找到板子的初始化代碼,恩,根據系統啓動時的打印信息發現會調用"setup_beaglebone"函數,其中很重要的配置項就是beaglebone_dev_cfg 數組,其是類型爲struct evm_dev_cfg 的數據結構,定義了一系列初始化函數。恩,好吧,咱們就把SPI相關的部分加上。修改beaglebone_dev_cfg爲: 數組
/* Beaglebone Rev A3 and after */ static struct evm_dev_cfg beaglebone_dev_cfg[] = { {tps65217_init, DEV_ON_BASEBOARD, PROFILE_NONE}, {mii1_init, DEV_ON_BASEBOARD, PROFILE_NONE}, {usb0_init, DEV_ON_BASEBOARD, PROFILE_NONE}, {usb1_init, DEV_ON_BASEBOARD, PROFILE_NONE}, {i2c2_init, DEV_ON_BASEBOARD, PROFILE_NONE}, {mmc0_init, DEV_ON_BASEBOARD, PROFILE_NONE}, {boneleds_init, DEV_ON_BASEBOARD, PROFILE_ALL}, {bonew1_gpio_init, DEV_ON_BASEBOARD, PROFILE_ALL}, {beaglebone_spi1_init, DEV_ON_BASEBOARD, PROFILE_NONE}, // ADD Support for spi device {NULL, 0, 0}, };其中咱們將SPI初始化的放在最後,避免其餘初始化代碼的影響。其中"beaglebone_spi1_init"代碼以下:
/* setup beaglebone spi1 */ static void beaglebone_spi1_init(int evm_id, int profile) { setup_pin_mux(spi1_pin_mux); spi_register_board_info(beaglebone_spi1_slave_info, ARRAY_SIZE(beaglebone_spi1_slave_info)); return; }beaglebone_spi1_slave_info能夠參考am33xx_spi1_slave_info來改寫。這些都弄完了,好了從新編譯內核,替換原先的內核,OK。到/sys/bus/spi下查看一下,devices目錄下應該有些東西。在本身寫一個spi_driver註冊一下,恩,差很少就能夠用了。具體的SPI驅動能夠參考網上的文章,或是我轉載的一篇。