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驱动能够参考网上的文章,或是我转载的一篇。