嵌入式爱好者

查看: 10894|回复: 7

[Android] 如何通过GPIO扩展SPI片选脚

[复制链接]

7

主题

26

帖子

64

积分

AM335x通行证

扫一扫,手机访问本帖
发表于 2016-7-27 11:11:51 | 显示全部楼层 |阅读模式
我使用的是OK335xS开发板,操作系统是安卓4.2。

我的需求是:需要通过SPI总线扩展3个SPI从设备。

待解决的问题是:开发板只引出了SPI1_CS0这个片选脚,如何配置将其他GPIO配置为另外两个设备的片选脚?

我的解决思路是:
a. spi_master使用TI提供的控制器驱动:spi-omap2-mcspi.c
b. spi_driver利用linux中的spidev.c进行修改,通过ioctrl扩展自己的接口;Android APP 通过 jni 直接访问 spi_driver 接口,完成与spi_device从设备的交互。
c. 修改board-am335xevm.c,注册生成spi_device从设备及设备文件节点

我现在已完成的工作是:
(1) 在board-am335xevm.c中,定义的board_info为:
static struct spi_board_info am335x_spi1_slave_info_s[] = {
        {
                .modalias      = "spidev",
                .max_speed_hz  = 48000000,//48Mbps
                .bus_num       = 2,
                .chip_select   = 0,
                .mode = SPI_MODE_1,
        },
        {
                .modalias      = "spidev",
                .max_speed_hz  = 48000000,//48Mbps
                .bus_num       = 2,
                .chip_select   = 1,
                .mode = SPI_MODE_1,      
},
        {
                .modalias      = "spidev",
                .max_speed_hz  = 48000000,//48Mbps
                .bus_num       = 2,
                .chip_select   = 2,
                .mode = SPI_MODE_1,
         },
};

(2) 相关pin_mux定义已改为:
static struct pinmux_config spi1_pin_mux_s[] = {
        {"mii1_col.spi1_sclk", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_INPUT_EN},
        {"mii1_crs.spi1_d0", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_PULL_UP | AM33XX_INPUT_EN},
        {"mii1_rxerr.spi1_d1", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_INPUT_EN},
// MY_nCS0  准备用作从设备1的片选
        {"rmii1_refclk.spi1_cs0", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_PULL_UP | AM33XX_INPUT_EN},
// MY_nCS1  准备用作从设备2的片选
        {"gpmc_wpn.gpio0_31", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT | AM33XX_PIN_OUTPUT_PULLUP},
// MY_nCS2  准备用作从设备3的片选
        {"gpmc_csn2.gpio1_31", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT | AM33XX_PIN_OUTPUT_PULLUP},
        {NULL, 0},
};

请问:要如何才能将 gpio0_31 和 gpio1_31 设置为 McSPI 控制器驱动 能自动识别的片选脚?

紧急等待中,盼复!谢谢!


回复

使用道具 举报

7

主题

26

帖子

64

积分

AM335x通行证

 楼主| 发表于 2016-7-27 15:26:26 | 显示全部楼层
版主不在吗?
点评回复 支持 反对

使用道具 举报

1

主题

3669

帖子

3935

积分

发表于 2016-7-27 16:36:06 | 显示全部楼层
您好:
    您看一下am335xevm.c文件中原来的spi的csn是如何配置的,再看一下手册里要改的引脚能不能复用成cs
    可以的话就参考之前csn的配置就行

点评

在board-am335xevm.c中,原来的spi_board_info是:[/backcolor] static struct spi_board_info am335x_spi1_slave_info_s[] = {[/backcolor] {[/backcolor] .modalias = "spidev",[  详情 回复 发表于 2016-7-28 10:56
技术支持电话:0312-3119192
技术支持邮箱:Android@forlinx.com
点评回复 支持 反对

使用道具 举报

7

主题

26

帖子

64

积分

AM335x通行证

 楼主| 发表于 2016-7-28 10:56:55 | 显示全部楼层
飞凌-chongzi 发表于 2016-7-27 16:36
您好:
    您看一下am335xevm.c文件中原来的spi的csn是如何配置的,再看一下手册里要改的引脚能不能复用 ...

在board-am335xevm.c中,原来的spi_board_info是:
static struct spi_board_info am335x_spi1_slave_info_s[] = {
        {
                .modalias      = "spidev",
                .max_speed_hz  = 48000000,//48Mbps
                .bus_num       = 2,
                .chip_select   = 0,     【1】
                .mode = SPI_MODE_1,
        },
};

相应的pin_mux设置为:
/*spi1  con9*/
static struct pinmux_config spi1_pin_mux_s[] = {
        {"mii1_col.spi1_sclk", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_INPUT_EN},
        {"mii1_crs.spi1_d0", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_PULL_UP | AM33XX_INPUT_EN},
        {"mii1_rxerr.spi1_d1", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_INPUT_EN},
        {"rmii1_refclk.spi1_cs0", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL| AM33XX_PULL_UP | AM33XX_INPUT_EN},    【2】
        {NULL, 0},
};


我的疑问是:【1】和【2】之间的关联在哪里体现,.chip_select的数值,与片选管脚之间有默认的关联规则吗?还是有其他配置来指明这个关联关系?

请指教!
点评回复 支持 反对

使用道具 举报

1

主题

3669

帖子

3935

积分

发表于 2016-7-28 17:18:01 | 显示全部楼层
您好:
    您的两路gpio的片选脚需要在spi的驱动中定义,您的MY_nCS0的拉高拉低是由硬件实现的,但您扩展的要自己定义拉高拉低的信息
    您试一下吧,不过我们没做过这方面的尝试,不敢保证

点评

非常感谢你的关注! (1)“您的MY_nCS0的拉高拉低是由硬件实现的”是不是说这个管脚的控制,完全由McSPI芯片实现拉高拉低?还是说它是由McSPI的驱动(spi-omap2-mcspi.c)在适当的时机来进行拉高拉低? (2)“  详情 回复 发表于 2016-7-29 10:16
技术支持电话:0312-3119192
技术支持邮箱:Android@forlinx.com
点评回复 支持 反对

使用道具 举报

7

主题

26

帖子

64

积分

AM335x通行证

 楼主| 发表于 2016-7-29 10:16:45 | 显示全部楼层
飞凌-chongzi 发表于 2016-7-28 17:18
您好:
    您的两路gpio的片选脚需要在spi的驱动中定义,您的MY_nCS0的拉高拉低是由硬件实现的,但您扩展 ...

非常感谢你的关注!

(1)“您的MY_nCS0的拉高拉低是由硬件实现的”是不是说这个管脚的控制,完全由McSPI芯片实现拉高拉低?还是说它是由McSPI的驱动(spi-omap2-mcspi.c)在适当的时机来进行拉高拉低?
(2)“自己定义拉高拉低的信息”,具体要怎么定义,能不能说的再详细些?board-am335xevm.c看了很多遍了,还是没搞懂怎么弄。:(

再次感谢!



点评回复 支持 反对

使用道具 举报

1

主题

3669

帖子

3935

积分

发表于 2016-7-29 13:50:17 | 显示全部楼层
liuzhu 发表于 2016-7-29 10:16
非常感谢你的关注!

(1)“您的MY_nCS0的拉高拉低是由硬件实现的”是不是说这个管脚的控制,完全由Mc ...

您好:
    (1)MY_nCS0就是完全由McSPI芯片实现拉高拉低
    (2)这一点您得自己看了,网上应该有教程的,如果要求我们解决的话就得走项目定制的渠道了
技术支持电话:0312-3119192
技术支持邮箱:Android@forlinx.com
点评回复 支持 反对

使用道具 举报

7

主题

26

帖子

64

积分

AM335x通行证

 楼主| 发表于 2016-7-29 18:05:40 | 显示全部楼层
好的,知道了。
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-5-6 09:49

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表