在freescale mx6q平台上添加spi资源

1:配置管脚为SPI功能

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

(以添加SPI2为例)

[cpp] view plaincopy

  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中将有相关函数对管脚进行统一初始化。

完成寄存器配置的工作。

[cpp] view plaincopy

  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片选管脚宏定义:

[cpp] view plaincopy

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

添加相关结构体

[cpp] view plaincopy

  1. <span style="font-size:14px;">static int mx6q_marsboard_spi1_cs[] = {
  2. SABRESD_ECSPI2_CS0,
  3. };
  4. </span>

[cpp] view plaincopy

  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则为挂载驱动的总线选择。

[cpp] view plaincopy

  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测试程序对接口进行测试

[cpp] view plaincopy

  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 <[email protected]>
  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种),时钟频率等参数。

时间: 2024-10-17 08:46:21

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

freescale mx6q平台上添加spi资源

1:配置管脚为SPI功能 在board-mx6q_sabresd.h的最后添加,复制被重定义 (以添加SPI2为例) [cpp] view plain copy /* ECSPI2*/ MX6Q_PAD_EIM_CS0__ECSPI2_SCLK, MX6Q_PAD_EIM_CS1__ECSPI2_MOSI, MX6Q_PAD_EIM_OE__ECSPI2_MISO, MX6Q_PAD_CSI0_DAT11__GPIO_5_29, 之后再板级文件board-mx6q_sabresd.c中将有相关函

微信公众平台开发之在网页上添加分享到朋友圈,关注微信号等按钮

微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添加分享到朋友圈,关注微信号等按钮. 一.微信浏览器 通过 Mac 远程调试 iPhone 上微信自己的网页,我们可以发现微信内嵌浏览器定义了一个私有 JavaScript 对象:WeixinJSBridge,通过操作这个对象的相关方法可以实现分享到微信朋友圈,和判断一个微信号的关注状态以及实现关注指定微信

如何在Java平台上使用脚本语言做Java开发

如何在Java平台上使用脚本语言做Java开发     最近开始流行区分Java平台和Java语言,但很多Java开发者还是不能确定如何在 Java应用程序开发中结合脚本.本篇文章,Gregor Roth给出了在Java平台上使用脚本的方法.通过这篇文章,你可以了解怎样在你的Java应用程序中使用脚本,是否你要通过使用Groovy和 Jython把不同的Java应用程序模块粘合在一起,或者写一个你自己的基于JRuby的应用程序,适用于Java平台. 作为一个Java开发者,你可能已经注意到了,J

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

FreeLine是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部开源,稳定性方面:完善的基线对齐,进程级别异常隔离机制.性能方面:内部采用了类似Facebook的开源工具buck的多工程多任务并发思想:端口扫描,代码扫描,并发编译,并发dx,并发merge dex等策略,在多核机器上有明显加速效果,另外在class及dex,resources层面作了相应缓存策略,做到真正增量开发,另外引入

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

链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框架,其跨平台的特性让它备受开发公司的欢迎.这里我就不做概念性的解释了,通过这篇文章你就会了解到,它的跨平台性”是个什么样子的“---有点拟人化了 我举个比较形象的例子: 有A.B.C三个部落,A部落的语言是A和O语言,B部落的语言是B和O语言,C部落的语言是C和O语言.你作为一个外星球人你会选择去学

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

关于如何在非微软平台上建立高信任的SharePoint应用程序 原文 :http://blogs.msdn.com/b/kaevans/archive/2014/07/14/high-trust-sharepoint-apps-on-non-microsoft-platforms.aspx 1.前言 开篇明之,哥无代码发布,也不提供解决方案. 我只是说明在非微软技术平台上建立低信任或是高信任应用程序是非常自由的(PS:也是非常痛苦的). 作为一个微软技术的研发者,我也长时间没有写Java或是PH

Cordys BOP平台上角色定义和功能

本主题介绍在流程平台上各种角色和功能. 角色确定了用户在租户里所能执行的权限和活动,以及在任务中的规范授权.在租户中创建角色或在应用程序内来实现,然后把角色分配给用户.只要用户通过角色提供一定的权限,他们就能部署应用.用户能访问应用中内容的程度,取决于他们所分配的角色. 例如,用户可以有客户服务代表.主管.经理的角色.往往经理或主管可能只有审批任务的权限,审批通过或退回. 角色可以嵌套,这意味着一个角色可以从另一个角色获取来增加由超级角色所提供的权限.角色可以分类如下: 功能角色(Functio

分享一些 Windows 平台上的神器

下面分享一些 Windows 平台上日常开发使用的软件,有些软件我自认为是神器,可以大大提高效率. 编辑器类软件 IntelliJ IDEA IntelliJ IDEA 内部集成 Java 开发环境,具有代码智能提示,智能搜索,代码重构,版本控制工具集成(git,svn等),以及支持主流开源框架,如Spring.另外 IntelliJ IDEA 拥有一个丰富的插件库,可以很方便安装插件.通过安装插件,IDEA 还可以支持其他语言,如 Python. 建议通过 ToolBox 安装 Intelli

Go语言在国产CPU平台上应用前景的探索与思考

http://www.chinaaet.com/article/3000087559 0 引言 CPU是电子产品的核心,代表着信息产业的发展水平.CPU发展至今已经有四十多年的历史了,实际就是Intel公司的发展历史[1].Intel的CPU和其兼容产品占领了PC的大半江山.我国CPU战略已经发展十余年,部分领域完全具有核心技术,产业化取得积极进展,但是与国际主流厂商Intel等仍存在较大差距.国产CPU由于受多方因素制约,单核性能并不高,在2000年左右所有的微处理器厂商都转向了多核微处理器的