1:配置管脚为SPI功能

在board-mx6q_sabresd.h的最后添加,复制被重定义

(以添加SPI2为例)

  1. <span style="font-size:18px;">        MX6Q_PAD_EIM_CS0__ECSPI2_SCLK,
  2. MX6Q_PAD_EIM_CS1__ECSPI2_MOSI,
  3. MX6Q_PAD_EIM_OE__ECSPI2_MISO,
  4. MX6Q_PAD_CSI0_DAT11__ECSPI2_SS0 ,
  5. </span>

之后再板级文件board-mx6q_sabresd.c中将有相关函数对管脚进行统一初始化。

完成寄存器配置的工作。

  1. <span style="font-size:18px;">  mxc_iomux_v3_setup_multiple_pads(mx6q_sabresd_pads,
  2. ARRAY_SIZE(mx6q_sabresd_pads));
  3. mxc_iomux_v3_setup_multiple_pads(mx6q_sabresd_cstm_tq_pads,\
  4. ARRAY_SIZE(mx6q_sabresd_cstm_tq_pads));</span>

2:在板级文件board-mx6q_sabresd.c中添加以下代码

将匹配到driver/spi/spidev.c文件中的驱动源码

2.1完成SPI master的注册

SPI2片选管脚宏定义:

  1. <span style="font-size:14px;">#define SABRESD_ECSPI2_CS0 IMX_GPIO_NR(5, 29)</span>

添加相关结构体

  1. <span style="font-size:14px;">static int mx6q_marsboard_spi1_cs[] = {
  2. SABRESD_ECSPI2_CS0,
  3. };
  4. </span>
  1. <span style="font-size:14px;">static const struct spi_imx_master mx6q_sabresd_spi2_data __initconst = {
  2. .chipselect = mx6q_marsboard_spi2_cs,
  3. .num_chipselect = ARRAY_SIZE(mx6q_marsboard_spi1_cs),
  4. };
  5. </span>

2.2在spi 总线上匹配spi2的驱动文件

mx6q平台有2路spi资源,0/1,其中的bus_num则为挂载驱动的总线选择。

  1. <span style="font-size:18px;"><span style="font-size:14px;">static struct mtd_partition imx6_sabrelite_spi_nor_partitions[] = {
  2. {
  3. .name = "bootloader",
  4. .offset = 0,
  5. .size = 0x00100000,
  6. },
  7. {
  8. .name = "kernel",
  9. .offset = MTDPART_OFS_APPEND,
  10. .size = MTDPART_SIZ_FULL,
  11. },
  12. };
  13. static struct flash_platform_data imx6_sabrelite__spi_flash_data = {
  14. .name = "spidev",  / /匹配原则。
  15. .parts = imx6_sabrelite_spi_nor_partitions,
  16. .nr_parts = ARRAY_SIZE(imx6_sabrelite_spi_nor_partitions),
  17. .type = "sst25vf016b",
  18. };
  19. static struct spi_board_info imx6_sabrelite_spi_nor_device[] __initdata = {
  20. {
  21. .modalias = "spidev",
  22. .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
  23. .bus_num = 1,    //设备挂载第几号spi总线上
  24. .chip_select = 0,
  25. .platform_data = &imx6_sabrelite__spi_flash_data,
  26. },
  27. };
  28. spi_register_board_info(imx6_sabrelite_spi_nor_device,
  29. ARRAY_SIZE(imx6_sabrelite_spi_nor_device));
  30. imx6q_add_ecspi(0, &mx6q_sabrelite_spi2_data);
  31. </span>
  32. </span>

3:内核配置

查看spidev.c文件目录下的Kconfig以及Makefile得知内核驱动的添加方法

选择蓝色部分选项,将spidev.c文件添加到内核中。

4:查看开发板/sys/bus/spi/drivers/spidev目录

在/dev下生成设备文件/dev/spidev1.0

5:使用freescale官方的bsp包中的spi测试程序对接口进行测试

  1. <span style="font-size:12px;">/*
  2. * SPI testing utility (using spidev driver)
  3. *
  4. * Copyright (c) 2007  MontaVista Software, Inc.
  5. * Copyright (c) 2007  Anton Vorontsov <avorontsov@ru.mvista.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License.
  10. *
  11. * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
  12. */
  13. #include <stdint.h>
  14. #include <unistd.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <getopt.h>
  18. #include <fcntl.h>
  19. #include <sys/ioctl.h>
  20. #include <linux/types.h>
  21. #include <linux/spi/spidev.h>
  22. #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
  23. static void pabort(const char *s)
  24. {
  25. perror(s);
  26. abort();
  27. }
  28. static const char *device = "/dev/spidev1.0";
  29. static uint8_t mode;
  30. static uint8_t bits = 8;
  31. static uint32_t speed = 500000;
  32. static uint16_t delay;
  33. static void transfer(int fd)
  34. {
  35. int ret;
  36. uint8_t tx[] = {
  37. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  38. 0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
  39. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  40. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  41. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  42. 0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
  43. 0xF0, 0x0D,
  44. };
  45. uint8_t rx[ARRAY_SIZE(tx)] = {0, };
  46. struct spi_ioc_transfer tr = {
  47. .tx_buf = (unsigned long)tx,
  48. .rx_buf = (unsigned long)rx,
  49. .len = ARRAY_SIZE(tx),
  50. .delay_usecs = delay,
  51. .speed_hz = speed,
  52. .bits_per_word = bits,
  53. };
  54. ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
  55. if (ret < 1)
  56. pabort("can't send spi message");
  57. for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
  58. if (!(ret % 6))
  59. puts("");
  60. printf("%.2X ", rx[ret]);
  61. }
  62. puts("");
  63. }
  64. int main(int argc, char *argv[])
  65. {
  66. int ret = 0;
  67. int fd;
  68. //parse_opts(argc, argv); /* for what ,unknow*/
  69. fd = open(device, O_RDWR);
  70. if (fd < 0)
  71. pabort("can't open device");
  72. /*
  73. * spi mode
  74. */
  75. ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
  76. if (ret == -1)
  77. pabort("can't set spi mode");
  78. ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
  79. if (ret == -1)
  80. pabort("can't get spi mode");
  81. /*
  82. * bits per word
  83. */
  84. ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
  85. if (ret == -1)
  86. pabort("can't set bits per word");
  87. ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
  88. if (ret == -1)
  89. pabort("can't get bits per word");
  90. /*
  91. * max speed hz
  92. */
  93. ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
  94. if (ret == -1)
  95. pabort("can't set max speed hz");
  96. ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
  97. if (ret == -1)
  98. pabort("can't get max speed hz");
  99. printf("spi mode: %d\n", mode);
  100. printf("bits per word: %d\n", bits);
  101. printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
  102. transfer(fd);
  103. close(fd);
  104. return ret;
  105. }
  106. </span>

执行应用程序,可以看到时序模式(spi 4种时序模式第0种),时钟频率等参数。

    /*
8 * SPI testing utility (using spidev driver)
9 *
10 * Copyright (c) 2007 MontaVista Software, Inc.
11 * Copyright (c) 2007 Anton Vorontsov <avorontsov@ru.mvista.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License.
16 *
17 * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
18 */ #include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h> #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) static void pabort(const char *s)
{
perror(s);
abort();
} static const char *device = "/dev/spidev1.0";
static uint8_t mode;
static uint8_t bits = ;
static uint32_t speed = ;
static uint16_t delay=; static void transfer(int fd)
{
int ret;
uint8_t tx[] = {
0x11, 0x12, 0x18, 0x78, 0x24, 0xa2,
0x40, 0x00, 0x13, 0x00, 0x00, 0x95,
0x23, 0x56, 0x54, 0x34, 0x45, 0x65,
0x69, 0x78, 0x98, 0xFF, 0xFF, 0x36,
};
uint8_t rx[ARRAY_SIZE(tx)] = {, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
.cs_change=
}; ret = ioctl(fd, SPI_IOC_MESSAGE(), &tr);
if (ret < )
pabort("can't send spi message"); for (ret = ; ret < ARRAY_SIZE(tx); ret++) {
if (!(ret % ))
puts("");
printf("%.2X ", rx[ret]);
}
puts("");
} static void print_usage(const char *prog)
{
printf("Usage: %s [-DsbdlHOLC3]\n", prog);
puts(" -D --device device to use (default /dev/spidev1.0)\n"
" -s --speed max speed (Hz)\n"
" -d --delay delay (usec)\n"
" -b --bpw bits per word \n"
" -l --loop loopback\n"
" -H --cpha clock phase\n"
" -O --cpol clock polarity\n"
" -L --lsb least significant bit first\n"
" -C --cs-high chip select active high\n"
" -3 --3wire SI/SO signals shared\n");
exit();
} static void parse_opts(int argc, char *argv[])
{
while () {
static const struct option lopts[] = {
{ "device", , , 'D' },
{ "speed", , , 's' },
{ "delay", , , 'd' },
{ "bpw", , , 'b' },
{ "loop", , , 'l' },
{ "cpha", , , 'H' },
{ "cpol", , , 'O' },
{ "lsb", , , 'L' },
{ "cs-high", , , 'C' },
{ "3wire", , , '' },
{ "no-cs", , , 'N' },
{ "ready", , , 'R' },
{ NULL, , , },
};
int c; c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL); if (c == -)
break; switch (c) {
case 'D':
device = optarg;
break;
case 's':
speed = atoi(optarg);
break;
case 'd':
delay = atoi(optarg);
break;
case 'b':
bits = atoi(optarg);
break;
case 'l':
mode |= SPI_LOOP;
break;
case 'H':
mode |= SPI_CPHA;
break;
case 'O':
mode |= SPI_CPOL;
break;
case 'L':
mode |= SPI_LSB_FIRST;
break;
case 'C':
mode |= SPI_CS_HIGH;
break;
case '':
mode |= SPI_3WIRE;
break;
case 'N':
mode |= SPI_NO_CS;
break;
case 'R':
mode |= SPI_READY;
break;
default:
print_usage(argv[]);
break;
}
}
} int main(int argc, char *argv[])
{
int ret = ;
int fd; parse_opts(argc, argv); fd = open(device, O_RDWR);
if (fd < )
pabort("can't open device"); /*
173 * spi mode
174 */
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -)
pabort("can't set spi mode"); ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -)
pabort("can't get spi mode"); /*
184 * bits per word
185 */
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -)
pabort("can't set bits per word"); ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -)
pabort("can't get bits per word"); /*
195 * max speed hz
196 */
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -)
pabort("can't set max speed hz"); ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -)
pabort("can't get max speed hz"); printf("spi mode: %d\n", mode);
printf("bits per word: %d\n", bits);
printf("max speed: %d Hz (%d KHz)\n", speed, speed/); transfer(fd); close(fd); return ret;
}

在freescale mx6q平台上添加spi资源的更多相关文章

  1. 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序

    关于如何在非微软平台上建立高信任的SharePoint应用程序 原文 :http://blogs.msdn.com/b/kaevans/archive/2014/07/14/high-trust-sh ...

  2. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

  3. [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

    链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...

  4. Freeline--Android平台上的秒级编译方案

    Freeline 技术揭秘 Freeline是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部 ...

  5. 分享一些 Windows 平台上的神器

    下面分享一些 Windows 平台上日常开发使用的软件,有些软件我自认为是神器,可以大大提高效率. 编辑器类软件 IntelliJ IDEA IntelliJ IDEA 内部集成 Java 开发环境, ...

  6. 使用 Azure CLI 在 Azure China Cloud 云平台上手动部署一套 Cloud Foundry

    这篇文章将介绍如何使用 Azure CLI 在 Azure China Cloud 云平台上手动部署一套 Cloud Foundry.本文的目的在于: 了解作为 PaaS 的 Cloud Foundr ...

  7. 使用JavaScript调用手机平台上的原生API

    我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...

  8. Domino V8 在 UNIX/Linux 平台上的安装及其常见问题

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 Domino V8 的安装需求 Domino V8 可以支持多种平台和操作系统,表1 列出了其支持的各种 UNIX/Lin ...

  9. iOS 平台上常见的安装包有三种,deb、ipa 和 pxl

    前言:目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl. 其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统 ...

随机推荐

  1. firefox(火狐)怎么关闭鼠标拖拽搜索

    工具-附加组件-卸载<附加组件管理器> 即可. 这玩意真心坑爹,起这个名字的人绝对是吃屎了,这名字怎么和鼠标拖拽混到一起的 !!!   关键字:火狐:鼠标:鼠标拖拽:鼠标手势:关闭

  2. Mac下使用安装MongoDB

    1.安装方法1:Mac电脑上面安装很简单,直接下载需要的版本解压即可: 下载网址 https://www.mongodb.com/download-center?jmp=nav#community 方 ...

  3. 学习php必须要了解的一些知识

    前言:每个人的成功都是用辛勤的劳动换来的 一.网络的基础知识 IP地址:Internet protocol address 指的是互联网协议地址,由二进制构成,(IPV4是32位的二进制),我们人为的 ...

  4. SAP FI 中4个特殊期间

    标准SAP ERP里面有个13-16的4个特殊的会计期间,这4个特殊的会计期间如何使用?作用是什么? SAP记帐期间变式,会计年度与特殊期间. 记帐期间变式是较难理解的一个内容.不过要表达的内容很简单 ...

  5. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.2——将Eclipse开发的项目导入到AndroidStudio

    问题: 你想要将一个Eclipse ADT项目导入到Android Studio中. 解决方案: Android Studio提供了一个导入向导,可以重写已有的项目. 详细: 在Android Stu ...

  6. iOS学习笔记(四)——iOS应用程序生命周期

    开发应用程序都要了解其生命周期,开始接触android时也是从应用程序生命周期开始的,android的应用程序生命周期更多是其组件的生命周期,例如Activity.Service.今天我们接触一下iO ...

  7. VS2010编译报错FileTracker error FTK1011

    系统重装,TFS重新映射,编译项目报错,出现 FileTracker error FTK1011,折腾半天未搞定,网上找到答案,可能是路径更改导致(未验证): 修改MSNET.Framework 目标 ...

  8. VS中没有为此解决方案配置选中要生成的项目

    菜单->生成->配置管理器->给要生成的项目打钩

  9. python3 中引用 HTMLTestRunner.py 模块的注意事项

    HTMLTestRunner.py支持python2中运行,如果在python3.6.2中引用HTMLTestRunner.py模块,需要做一下更改: 1.更改HTMLTestRunner.py模块中 ...

  10. Windows系统Python 安装第三方模块时,提示pip版本有问题

    如果按照提示输入python -m pip install --upgrade pip 还不行, 那么执行easy_install --upgrade pip 即可 参考:https://stacko ...