am335x gpio 模拟 spi 驱动添加

  • kernel 内 make menuconfig

    //  make menuconfig 
    Device Drivers  --->
        [*] SPI support  --->
              <*>   GPIO-based bitbanging SPI Master   // 这个是gpio-spi 的驱动
              <*>   User mode SPI device driver support   // 这个是生成 /dev/spidev*.*的驱动
  • 在板级文件里面添加:

    //  vim arch/arm/mach-omap2/board-aplex_ECM_5416.c
    #define GPIO1_12 GPIO_TO_PIN(1, 12)                                         
    #define GPIO1_13 GPIO_TO_PIN(1, 13)                                         
    #define GPIO1_14 GPIO_TO_PIN(1, 14)                                         
    #define GPIO1_15 GPIO_TO_PIN(1, 15)                                         
    #define SPI_GPIO_BUS_NUM 3       // 设置spi 总线编号 
                                              
    static struct spi_gpio_platform_data ecm_5410_gpio_spi_data = {             
        .sck = GPIO1_12,            // 指定clk 的gpio     
        .mosi = GPIO1_13,         // 指定slave input                    
        .miso = GPIO1_14,          // 指定 slave output                  
        .num_chipselect = 1,      // 指定一共有几个cs           
    };                                                                          
                                                                                
    static struct platform_device ecm_5410_gpio_spi_device = {                  
        .name = "spi_gpio",       // 匹配 spi-gpio.c 里面的驱动名字                                              
        .id = SPI_GPIO_BUS_NUM,        // 配置 spi 总线编号                                         
        .dev = {                                                                
            .platform_data = &ecm_5410_gpio_spi_data,    // 指定配置数据                       
        },                                                                      
    };                                                                          
    // 配置 pin_mux                                                                            
    static struct pinmux_config ecm_5410_gpio_spi_pin_mux[] = {                 
        {"gpmc_ad12.gpio1_12", OMAP_MUX_MODE7 | AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
        {"gpmc_ad13.gpio1_13", OMAP_MUX_MODE7 | AM33XX_PULL_ENBL | AM33XX_PULL_UP | AM33XX_INPUT_EN},
        {"gpmc_ad14.gpio1_14", OMAP_MUX_MODE7 | AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
        {"gpmc_ad15.gpio1_15", OMAP_MUX_MODE7 | AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
    };                                                                          
                                                                                
    static struct spi_board_info  am335x_spi2_slave_info[] = {     
        {                                                                       
            .modalias = "spidev",                                               
            .max_speed_hz = 10000000,                                           
            .bus_num = SPI_GPIO_BUS_NUM,                                        
            .controller_data = (void *)GPIO1_15,       // 设置 cs 总线                         
            .chip_select   = 0,                                                    
            .mode = SPI_MODE_0,                                                    
        },                                                                         
    };                                                                             

    static void ecm_5410_gpio_spi_init(int evm_id, int profile)                 
    {                                                                           
        setup_pin_mux(ecm_5410_gpio_spi_pin_mux);                               
        // 总线设备注册,先配置到spi-gpio 的总线驱动                                                                        
        platform_device_register(&ecm_5410_gpio_spi_device);                    
         // spi 板级信息注册,生成 /dev/spidev3.0                                                                       
        spi_register_board_info(am335x_spi2_slave_info,                         
                    ARRAY_SIZE(am335x_spi2_slave_info));                        
    };                                                                          
                                                                               
    static struct evm_dev_cfg ECM_5412_dev_cfg[] = {                            
        // ... ... 加入板级初始化                                                              
        {ecm_5410_gpio_spi_init,   DEV_ON_BASEBOARD, PROFILE_ALL},              
        {NULL, 0, 0},                                                           
    };                                                                          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPIO 模拟 SPI 驱动通常用于在嵌入式系统中,通过软件模拟 SPI 总线来控制外设,以实现数据的传输和通信。下面是一个简单的 GPIO 模拟 SPI 驱动的代码示例: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/gpio.h> #include <linux/spi/spi.h> static struct spi_board_info spi_board_info = { .modalias = "spi-gpio", .max_speed_hz = 1000000, .bus_num = 0, .chip_select = 0, .mode = SPI_MODE_0, }; static struct spi_device *spi_device; static int spi_gpio_probe(struct platform_device *pdev) { int ret; ret = gpio_request(SPI_GPIO_SCLK, "spi-gpio-sclk"); if (ret < 0) { printk(KERN_ERR "Failed to request SCLK GPIO\n"); goto err_sclk; } ret = gpio_request(SPI_GPIO_MOSI, "spi-gpio-mosi"); if (ret < 0) { printk(KERN_ERR "Failed to request MOSI GPIO\n"); goto err_mosi; } ret = gpio_request(SPI_GPIO_MISO, "spi-gpio-miso"); if (ret < 0) { printk(KERN_ERR "Failed to request MISO GPIO\n"); goto err_miso; } spi_device = spi_new_device(&pdev->dev, &spi_board_info); if (!spi_device) { printk(KERN_ERR "Failed to create SPI device\n"); goto err_spi; } ret = spi_setup(spi_device); if (ret < 0) { printk(KERN_ERR "Failed to setup SPI device\n"); goto err_setup; } return 0; err_setup: spi_unregister_device(spi_device); err_spi: gpio_free(SPI_GPIO_MISO); err_miso: gpio_free(SPI_GPIO_MOSI); err_mosi: gpio_free(SPI_GPIO_SCLK); err_sclk: return ret; } static int spi_gpio_remove(struct platform_device *pdev) { spi_unregister_device(spi_device); gpio_free(SPI_GPIO_MISO); gpio_free(SPI_GPIO_MOSI); gpio_free(SPI_GPIO_SCLK); return 0; } static struct platform_driver spi_gpio_driver = { .probe = spi_gpio_probe, .remove = spi_gpio_remove, .driver = { .name = "spi-gpio", }, }; static int __init spi_gpio_init(void) { return platform_driver_register(&spi_gpio_driver); } static void __exit spi_gpio_exit(void) { platform_driver_unregister(&spi_gpio_driver); } module_init(spi_gpio_init); module_exit(spi_gpio_exit); ``` 在这个例子中,我们通过 GPIO 口来模拟 SPI 总线的 SCLK、MOSI、MISO 三个信号线,然后创建一个 SPI 设备,并使用 spi_new_device() 函数来注册 SPI 设备。最后,我们在 spi_setup() 函数中设置 SPI 设备的一些参数,例如传输速率和传输模式等。需要注意的是,这只是一个简单的示例,具体实现可能会因为硬件接口和驱动程序的不同而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值