MTK 驱动 Kernel-3.18中如何配置和使用spi
[DESCRIPTION]
(1)kernel-3.18中使用了device tree机制,可以通过device tree来配置spi device。
(2)使用DMA 方式传输时,需要正确申请buffer,才能传输成功。
[SOLUTION]
kernel-3.18中使用 spi 的步骤:
Step1:添加 spi device:
在$(project).dts文件的末尾增加spi device,example:在spi0上增加device
&spi0{
#address-cells = <1>;
#size-cells = <0>;
test_spi{
compatible = "test_spi_device"; /*set spi->modalias must*/
reg = <0>; /*set spi->chip_select must*/
spi-max-frequency = <1000000>; /*set spi->max_speed_hz must*/
/*other infromation*/
/*spi-cpha;*/ /*set cpha=1, optional*/
/*spi-cpol;*/ /*set cpol=1, optional*/
/*spi-cs-high;*/ /*set cs active level=1, optional*/
/*spi-3wire;*/ /*set no-tx or no-rx, optional*/
/*spi-lsb-first;*/ /*set lsb-first transfer, optional*/
};
};
Step2:添加 spi driver
在driver中添加spi_driver,example:
#if defined(CONFIG_OF)
static struct of_device_id test_match_table[] = {
{.compatible = "test_spi_device",}, /*与devicetree中的spi device的compatible一致*/
{},
};
#endif
static struct spi_driver spi_test_driver = {
.driver = {
.name = "test_spi",
.owner = THIS_MODULE,
#if defined(CONFIG_OF)
.of_match_table = test_match_table,
#endif
},
.probe = spi_test_probe,
.remove = spi_test_remove,
//...
};
Step3:配置spi的参数
在driver中配置spi的传输参数,example:
#include <mt_spi.h>
int spi_set_para(struct spi_device *spidev)
{
struct mt_chip_conf *chip_config = NULL;
if(spidev == NULL){
pr_err("%s spidev is null.\n", __func__);
return -EINVAL;
}
chip_config = (struct mt_chip_conf *)spidev->controller_data;
if(chip_config == NULL){
pr_err("%s chip_config is null.\n", __func__);
return -EINVAL;
}
spi_bus_lock(spidev->master); // lock bus
/*****这里修改设定您想要修改的参数*****/
chip_config->setuptime = 3; /*传输开始时cs信号的setup时间(cs开始 -> clk开始)*/
chip_config->holdtime = 3; /*传输结束后cs信号的保持时间(clk停止 -> cs停止)*/
chip_config->high_time = 10; /*clk高电平持续时间*/
chip_config->low_time = 10; /*clk低电平持续时间*/
chip_config->cs_idletime = 2; /*cs空闲时间*/
chip_config->ulthgh_thrsh = 0; /*未使用*/
chip_config->cs_pol = 0; /*cs有效电平*/
chip_config->sample_sel = 0; /**/
chip_config->cpol = 0; /*clk空闲时的电平*/
chip_config->cpha = 1; /*mosi/miso的采样点(0:前沿; 1:后沿)*/
chip_config->rx_mlsb = 1; /*rx是否高位先发送(1:先发msb; 0:先发lsb)*/
chip_config->tx_mlsb = 1; /*tx是否高位先发送(1:先发msb; 0:先发lsb)*/
chip_config->tx_endian = 0; /*tx发送数据的端序(仅DMA mode有效)*/
chip_config->rx_endian = 0; /*rx发送数据的端序(仅DMA mode有效)*/
chip_config->com_mod = DMA_TRANSFER; /*传输mode: FIFO_TRANSFER or DMA_TRANSFER*/
chip_config->pause = 0; /*是否开启pause mode(1:enable; 0:disable)*/
chip_config->finish_intr = 1; /*是否打开传输完成的中断(1:打开; 0:不打开, code默认是打开的)*/
chip_config->deassert = 0; /*是否使用deassert mode,一般不使用*/
chip_config->ulthigh = 0; /*未使用*/
chip_config->tckdly = 0; /*一般设置为0*/
/*end*/
spi_setup(spidev);
spi_bus_unlock(spidev->master); // unlock bus
return 0;
}
Step4:使用spi传输
(1)FIFO mode
a。将spi 参数设置为FIFO mode,
chip_config->com_mod = FIFO_TRANSFER;
b。然后使用linux标准的spi传输函数进行数据传输,一般使用 spi_sync().
int spi_sync(struct spi_device *spi, struct spi_message *message);
(2)DMA mode
a。将spi 参数设置为DMA mode,
chip_config->com_mod = DMA_TRANSFER;
b。申请buf,需要使用flag: GFP_DMA
buf = kzalloc(buf_len, GFP_KERNEL | GFP_DMA);
c。然后使用linux标准的spi传输函数进行数据传输,一般使用 spi_sync().
Note:
(1) $(project) 是指工程名。example:evb6755_64。
(2)当使用DMA方式进行传输时,请将 spi_transfer中的tx_buf和rx_buf都设置上,不要设置为NULL.
更多MTKJ技术资料,可查看新移科技官网网站-技术论坛。
新移科技提供GSM/GPRS/EDGE,TD-SCDMA,WCDMA,CDMA1X/EVDO,LTE-TDD,LTD-FDD,NB-IOT全系列无线通讯核心模块以及基于无线通讯核心模块的物联网应用解决方案,产品应用涉及智能手持终端,POS机,广告机,机器人,智能家居,工业控制,车载导航,安防监控,移动医疗,环境监测,培训教育及物联网等相关领域。
MTK 驱动 Kernel-3.18中如何配置和使用spi相关推荐
- MTK 驱动开发(2)---GPIO 配置
1.GPIO 配置 拿到一个手机项目,GPIO 总是和MTK 提供的默认的代码的GPIO 的使用不一样,需要根据原理图进行修改GPIO配置,配置GPIO 需要使用MTK 提供的工具DrvGen.exe ...
- MTK 驱动开发(18)---LCD 参数理解
转载自http://blog.csdn.net/longxiaowu/article/details/24319933 Linux内核的amba lcd控制器使用clcd_panel结构体表示一个LC ...
- 解决w: pt/sources.list:18 中被配置了多次
是因为在配置sources.list重复了需要删除一个 sudo vim /etc/apt/sources.list 进入这个界面就可以删除了 17,18之中删除一个 不知道怎么操作的看我另一篇文章h ...
- MTK 驱动(47)---使用PWM配置背光如何配置,及频率计算
[MT6582_LCD]使用PWM配置背光如何配置,及频率计算 2016年07月08日 10:10:22 阅读数:1175 MT6582 使用PWM配置背光及频率计算 [SOLUTION] 以GP ...
- 【展讯平台】Android 驱动(Kernel)、系统(framework) 定制,调试日志,持续更新中..
前言 [展讯平台]Android 4.4 驱动(Kernel).系统(framework) 定制,调试日志 正文 1:提高串口日志等级 查看 adb shell cat /proc/sys/kerne ...
- linux mint 安装内核,如何在Ubuntu, Linux Mint中安装Linux Kernel 4.18
Linus Torvalds终于在12日下午宣布发布Linux Kernel 4.18. 他在lkml.org写道: 这是一个非常平静的一周,可以说我上周可以按时发布,但我们确实有一些小的更新. 主要 ...
- MTK 驱动开发(32)---Sensor 移植及调试2
接续上一节,本文主要介绍驱动部分的客制化 3. Sensor Driver 的客制化 主要涉及三个方面: 1)配置 codegen.dws ---I2C 地址.eint.gpio 2)配置驱动参数 3 ...
- MTK 驱动(4)---MTK Android Driver知识大全
MTK Android Driver知识大全 一.Display 1.lcm 相关概念 1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口).DPI(也叫RGB接口).DSI. 在 ...
- MTK 驱动(100)---GPS调试宝典
GPS 基本知识 Ø 1.1)GPS定位和网络定位有什么不同? GPS定位是需要卫星参与的,设备借助搜到的卫星讯号,来计算出来设备的位置. 网络定位是指利用基站.WIFI MAC,获取一个粗略的位置 ...
- 驱动框架8——将驱动集成到内核中
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 十五.将驱动添加到内核中 1.驱动的存在形式 (1)野生,优势是方便调试开发,所以在开发阶段都是这种: (2)家养 ...
最新文章
- mysql-5.7.14-win32.zip 解压版 安装过程
- numpy生成随机数
- mysql创建表的时候显式申明字符集
- 人工智能时代,Python机器学习及分析工具
- P2045 方格取数加强版
- 网页解析的全过程(输入url到展示页面)
- Flutter RefreshIndicator 下拉刷新组件 Material 风格的刷新效果
- linux改文件系统类型,linux文件系统类型及mount
- mysql 1539_MySQL:半同步(三)从库端初始化和回调函数
- 用matlab辨识系统,Matlab系统辨识工具箱
- php数组中随机抽取,PHP 数组中随机抽取一些元素_PHP教程
- 免费的生成GIF和截屏的PC端小工具
- html5在不同浏览器兼容,HTML5浏览器兼容性解决方案
- NIOSII 安装问题汇总
- JavaScript基础知识学习
- ORAN C平面 Section Extension 5
- php微信摇一摇开发文档,摇一摇关注的JSAPI
- python制作数据增长动图_请问一下这种数据动图是如何做出来的?
- 全面了解超声波传感器
- 基于深度学习的新冠疫情数据分析