博主使用的是天嵌公司的335x_coreC。
内核版本linux3.2。
发现该源码没有基本SPI驱动,故在这里记录一下如何添加基本SPI。
1.使用make ARCH=arm menuconfig 进入配置单选中以下两项
Device Drivers --->
[*] SPI support --->
<*> McSPI driver for OMAP
<*> User mode SPI device driver support
选中以上两项后,那么就会编译drivers/spi/spidev.c
文件,该文件的内容是注册一个spidev驱动。该驱动是一个字符设备驱动。
2.修改板级信息文件: arch/arm/mach-omap2/board-am335xevm.c
(1)搜索“spi0_pin_mux”并在该结构体下面添加新管脚配置的结构体“spi1_pin_mux”(复制即可),如果存在则对比查看有没错误
/* Module pin mux for SPI fash */
static struct pinmux_config spi0_pin_mux[] = {
....
};
/* Module pin mux for SPI flash */
static struct pinmux_config spi1_pin_mux[] = {
{"mcasp0_aclkx.spi1_sclk", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
| AM33XX_INPUT_EN},
{"mcasp0_fsx.spi1_d0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
| AM33XX_PULL_UP | AM33XX_INPUT_EN},
{"mcasp0_axr0.spi1_d1", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
| AM33XX_INPUT_EN},
{"rmii1_refclk.spi1_cs0", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL
| AM33XX_PULL_UP | AM33XX_INPUT_EN},
{NULL, 0},
};
(2)搜索“spi0_init”并在该函数下面添加新的初始化函数“spi1_init”(复制即可),如果存在则对比查看有没错误
/* setup spi0 */
static void spi0_init(int evm_id, int profile)
{
...
}
/* setup spi1 */
static void spi1_init(int evm_id, int profile)
{
setup_pin_mux(spi1_pin_mux);
spi_register_board_info(am335x_spi1_slave_info,
ARRAY_SIZE(am335x_spi1_slave_info));
return;
}
(3)搜索“am335x_spi1_slave_info”从设备信息,并修改,如搜索不到则添加:
static struct spi_board_info am335x_spi1_slave_info[] = {
{
.modalias = "spidev",
//.platform_data = &Acceleration_sensor,
//.irq = -1,
//.mode =SPI_MODE_0,
//.max_speed_hz = 120000,
//.bus_num = 2,
//.chip_select = 0,
.max_speed_hz = 48000000, //最大频率
.bus_num = 2, // 生成spidev2.0 ,也代表总线为2
.chip_select = 0, // 表示使用spi1_cs0
.mode = SPI_MODE_0, //使用模式0
},
};
(4)搜索“embedsky_evm_dev_cfg”,注销或删除“spi0_init”,添加“spi1_init”:
static struct evm_dev_cfg embedsky_evm_dev_cfg[] = {
{enable_ehrpwm1A,DEV_ON_BASEBOARD, PROFILE_0 },
{enable_ecap2,DEV_ON_BASEBOARD, PROFILE_0},
{lcdc_init, DEV_ON_BASEBOARD, PROFILE_0},
{tsc_init, DEV_ON_BASEBOARD, PROFILE_0},
{i2c0_init, DEV_ON_BASEBOARD, PROFILE_0},
{i2c1_init, DEV_ON_BASEBOARD, PROFILE_0},
#ifdef CONFIG_RTL8211
{rgmii1_init, DEV_ON_BASEBOARD, PROFILE_ALL},//网卡端口初始化
#else
{mii1_init, DEV_ON_BASEBOARD, PROFILE_ALL},//网卡端口初始化
#endif
{usb0_init, DEV_ON_BASEBOARD, PROFILE_ALL},
{usb1_init, DEV_ON_BASEBOARD, PROFILE_ALL},
{evm_nand_init, DEV_ON_BASEBOARD,PROFILE_ALL},
{mcasp1_init, DEV_ON_BASEBOARD, PROFILE_0},//sound
{mmc0_init, DEV_ON_BASEBOARD, (PROFILE_ALL)},
//{spi0_init, DEV_ON_BASEBOARD, PROFILE_2},
{spi1_init, DEV_ON_BASEBOARD, PROFILE_0},
3.从新编译,并烧写进板子
4.验证:
进入系统后 ls /dev/spidev*,后会出现spidev2.0设备
5.测试
使用内核源码内的demo,Documentation/spi/spidev_test.c,交叉编译后,短接MOSI和MISO可以测试了