Linux系统自带SPI接口驱动自测
来源:互联网 发布:冰点文库软件下载 编辑:程序博客网 时间:2024/05/18 20:50
本文主要验证linux-imx_share\Documentation\spi目录下spidev_test.c的测试例程,能否正常控制SPI接口。
一.开发环境分析
虚拟机导入的Ubuntu内核版本
ARM内核版本:
ARM的CPU处理器:freescale的i.mx6系列的处理器,型号为MCIMX6U7CVM08AC ,ARM双核A9。
官网上查到对应的数据手册为《i.MX 6Solo/6DualLite Applications Processor Reference Manual》。
根据数据手册,第8章8.5.4.3.1节,P421,表8-23表示,该i.mx6dl的处理器只有4个SPI接口。
检查杭州迈冲科技发货的底板,没有SPI接口引出来,该底板唯一引出的ECSPI5接口只有四核的处理器可以用,不适合该处理器。
二.驱动配置
1.修改设备树
找到内核源码的linux-imx_share\arch\arm\boot\dts目录下的imx6qdl-sabresd.dtsi,找到ecspi1的代码
将spidev这段注释去掉,开启这段代码。
2.修改内核配置
输入:make ARCH=arm menuconfig进行内核配置,进入配置界面,依次选择Device Drivers->SPI support,使User mode SPI device driver support选项起作用,选择Y,并save。
选择这个的目的是使spidev.c参与编译,原因可以参考linux-imx_share\drivers\spi目录下的Kconfig和Makefile。
配置好之后,运行./build.sh,编译生成zImage,zImage-imx6dl-sabresd-emmc.dtb烧写进板子。
检查新烧进去的系统里,dev目录下有无spidev32766.0。如有,表示spidev的设备驱动烧写成功。
三.测试
1.找到ECSPI的引脚,连接MISO和MOSI,进行自回环测试。
2.编写makefile生成自测代码spidev_test.c对应的可执行程序。
使用rz命令,将spidev_test上载至板子
接收的数据正确,自回环测试成功。
------------------------------------------------------------------------------------------------------------------------------------
疑问:生成的设备节点为什么是spidev32766.0?
在spidev.c中的函数spidev_probe里,找到设备节点的赋值。
spidev->devt = MKDEV(SPIDEV_MAJOR, minor); //计算出设备号//创建设备/dev/spidev%d.%d(spidev总线号.片选号)dev = device_create(spidev_class, &spi->dev, spidev->devt,spidev, "spidev%d.%d",spi->master->bus_num, spi->chip_select);下面看下spi->master->bus_num和spi->chip_select的值。
在drivers/spi目录下的spi.c文件中,spi_alloc_master函数中,给master->bus_num = -1进行了初始化。
struct spi_master *spi_alloc_master(struct device *dev, unsigned size){struct spi_master*master;if (!dev)return NULL;master = kzalloc(size + sizeof(*master), GFP_KERNEL);if (!master)return NULL;device_initialize(&master->dev);<span style="color:#3333ff;">master->bus_num = -1; //初始化<span style="color:#3333ff;">master->num_chipselect = 1;master->dev.class = &spi_master_class;master->dev.parent = get_device(dev);spi_master_set_devdata(master, &master[1]);return master;}在spi_register_master函数中,对bus_num进行了处理
/* convention: dynamically assigned bus IDs count down from the max */if (master->bus_num < 0) <span style="font-family: Arial, Helvetica, sans-serif;">{</span>
/* FIXME switch to an IDR based scheme, something like * I2C now uses, so we can't run out of "dynamic" IDs */master->bus_num = atomic_dec_return(&dyn_bus_id);dynamic = 1;}
其中dyn_bus_id计算结果是32767
static atomic_tdyn_bus_id = ATOMIC_INIT((1<<15) - 1);
#define atomic_dec_return(v) (atomic_sub_return(1, v))
static inline int atomic_sub_return(int i, atomic_t *v){unsigned long flags;int val;raw_local_irq_save(flags);val = v->counter;v->counter = val -= i;raw_local_irq_restore(flags);return val;}如此计算出master->bus_num=32766。
of_register_spi_devices函数里chip_select的获得是通过value赋值的,而value是通过设备树里的reg后面的值取得的
/* Device address */rc = of_property_read_u32(nc, "reg", &value);if (rc) {dev_err(&master->dev, "%s has no valid 'reg' property (%d)\n",nc->full_name, rc);spi_dev_put(spi);continue;}spi->chip_select = value;
spidev: spidev@0 {spi-max-frequency = <24000000>; reg = <0>; compatible = "rohm,dh2228fv"; };所以生成的设备节点号是spidev32766.0。
如果在imx6qdl-sabresd.dtsi设备树里,改成下面这样,则生成的设备节点号是spidev32766.1。
&ecspi1 {fsl,spi-num-chipselects = <2>; //改成2cs-gpios = <&gpio2 30 0>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_ecspi1_1>;status = "okay";flash: m25p32@0 {#address-cells = <1>;#size-cells = <1>;compatible = "winbond,w25q32";spi-max-frequency = <20000000>;reg = <0>;};spidev: spidev@1 {spi-max-frequency = <24000000>; reg = <1>; compatible = "rohm,dh2228fv"; };};
- Linux系统自带SPI接口驱动自测
- Linux系统自带SPI接口驱动自测
- Linux系统自带SPI接口驱动自测
- Linux系统自带spi驱动加载及应用程序编写方法详解
- Linux系统自带spi驱动加载及应用程序编写方法详解
- Linux系统自带spi驱动加载及应用程序编写方法详解
- Linux系统自带spi驱动加载及应用程序编写方法详解
- linux自带spi驱动 ,可自己配置CS
- 51单片机驱动VS1003(模拟spi/自带SPI)
- 笔记本自带读卡器linux驱动
- ZYNQ7000 芯片Linux下的SPI接口与驱动配置
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Qt creator needs a compiler set up to build. Configure a compiler in the kit options
- HDOJ 1068 Girls and Boys (最大匹配数 匈牙利算法)
- 多校6 A Boring Question 5793
- 获取linux服务器性能CPU、内存、硬盘等使用率 PHP
- git rebase后commit丢失
- Linux系统自带SPI接口驱动自测
- UIimage更改TintColor颜色
- libevent代码例子----定时器
- 【MFC】之CListCtrl用法及技巧(一)(转)
- context-param>与<init-param>的区别与作用
- Spring注解原理的详细剖析与实现
- POJ 2240 Arbitrage
- hdu1272-小希的迷宫 并查集
- 基于Bootstrap Tree View构建Java多级分类菜单