62 linux内核里基于GPIO口的SPI控制器驱动
来源:互联网 发布:搜索引擎优化流程 编辑:程序博客网 时间:2024/05/19 02:21
当SOC里的spi控制器不稳定,或者spi控制器不够用时,可以基于GPIO口扩展出SPI控制器.
在Linux内核里已提供了相应的代码,是一个平台驱动,只需写平台设备描述相关资源即可.
make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-Device Drivers ---> [*] SPI support ---> <*> GPIO-based bitbanging SPI Master
驱动源码在”drivers/spi/spi-gpio.c”
static struct platform_driver spi_gpio_driver = { .driver.name = DRIVER_NAME, //spi_gpio, 按名字匹配平台设备 .driver.owner = THIS_MODULE, .probe = spi_gpio_probe, .remove = __devexit_p(spi_gpio_remove),};module_platform_driver(spi_gpio_driver);//通过阅读平台驱动里的probe函数可以得知平台设备需要提供的参数static int __devinit spi_gpio_probe(struct platform_device *pdev){ int status; struct spi_master *master; struct spi_gpio *spi_gpio; struct spi_gpio_platform_data *pdata; u16 master_flags = 0; pdata = pdev->dev.platform_data; ... status = spi_gpio_request(pdata, dev_name(&pdev->dev), &master_flags); ... master = spi_alloc_master(&pdev->dev, sizeof *spi_gpio); ... spi_gpio = spi_master_get_devdata(master); platform_set_drvdata(pdev, spi_gpio); spi_gpio->pdev = pdev; master->flags = master_flags; master->bus_num = pdev->id; master->num_chipselect = SPI_N_CHIPSEL; master->setup = spi_gpio_setup; master->cleanup = spi_gpio_cleanup; spi_gpio->bitbang.master = spi_master_get(master); spi_gpio->bitbang.chipselect = spi_gpio_chipselect; ... spi_gpio->bitbang.setup_transfer = spi_bitbang_setup_transfer; status = spi_bitbang_start(&spi_gpio->bitbang); ... return status;}平台数据所用的类型"include/linux/spi/spi_gpio.h"struct spi_gpio_platform_data { unsigned sck; // SCL所用的IO口 unsigned mosi; // MOSI用的IO口 unsigned miso; // MISO用的IO口 u16 num_chipselect; //支持多少个spi设备};
///////////////////////////////////
例如把 PA7, PA8, PA9分别作为SPI控制器的SCL, MOSI, MISO
myspi_pdev.c
#include <linux/init.h>#include <linux/module.h>#include <linux/platform_device.h>#include <linux/spi/spi_gpio.h>#include <mach/gpio.h>struct spi_gpio_platform_data pdata = { GPIOA(7), GPIOA(8), GPIOA(9), 2};struct platform_device myspi_pdev = { .name = "spi_gpio", //与平台驱动名一致 .id = 3, //控制器的编号3 .dev = { .platform_data = &pdata, },}; module_driver(myspi_pdev, platform_device_register, platform_device_unregister);MODULE_LICENSE("GPL");
///////////////////////////
加载模块后,在/sys/bus/platform/drivers/spi_gpio目录下是否有spi_gpio.3平台设备与之匹配
阅读全文
0 0
- 62 linux内核里基于GPIO口的SPI控制器驱动
- 55 linux内核里基于GPIO口的I2C控制器驱动
- 61 OrangePi Linux内核里的spi控制器驱动
- 63 linux内核的SPI设备驱动模型及应用程序调用SPI控制器的方法
- 54 OrangePi linux内核里的i2c控制器驱动
- linux SPI驱动 - 模拟gpio
- Android 基于sx8652的触摸屏驱动(gpio模拟spi)
- Linux 内核设备驱动之GPIO驱动之GPIO 控制器描述
- Linux 内核设备驱动之GPIO驱动之GPIO 控制器设备描述
- linux内核里的GPIO操作函数
- linux内核里的GPIO操作函数
- 二、Linux spi 控制器驱动
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- hdu 4118 Holiday's Accommodation 树形dp
- 中间代码生成(C++)
- Ritorfit基础使用
- NKOJ-1521 芯片制作(染色法构图)
- Guava并发:ListenableFuture使用介绍以及示例
- 62 linux内核里基于GPIO口的SPI控制器驱动
- ABAP BINARY SEARCH--二分法
- 如何优雅地测量一只猫的体积
- java学习 —————— 集合类
- RAID详解
- Spring和第一个spring项目
- WebView、X5WebView技术点汇总
- Xmanager Enterprise 4 xshell的使用
- urlhelper 使用教程