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驱动可以参考网上的文章,或是我转载的一篇。
来源:oschina
链接:https://my.oschina.net/u/614480/blog/110492