Rockchip Developer Guide SPI
Rockchip-Developer-Guide-linux4.4-SPI
Rockchip-Developer-Guide-linux4.4-SPI
Rockchip-Developer-Guide-SPI
Rockchip-Developer-Guide-SPI
Rockchip-Developer-Guide-linux4.4-SPI
User Manual:
Open the PDF directly: View PDF .
Page Count: 6
Download | ![]() |
Open PDF In Browser | View PDF |
Rockchip SPI 开发指南 发布版本:1.00 作者邮箱:hhb@rock-chips.com 日期:2016.06 文件密级:公开资料 前言 概述 产品版本 芯片名称 内核版本 采用linxu4.4的所有芯片 Linux4.4 读者对象 本文档(本指南)主要适用于以下工程师: 技术支持工程师 软件开发工程师 修订记录 日期 版本 作者 2016-06-29 V1.0 洪慧斌 Rockchip SPI 开发指南 1 Rockchip SPI功能特点 2 内核软件 2.1 代码路径 2.2 内核配置 2.3 DTS节点配置 2.3 SPI设备驱动 2.4 User mode SPI device配置说明 2.4.1 内核配置 2.4.2 DTS配置 2.4.3 内核补丁 2.4.4 使用说明 3 SPI 内核测试驱动 3.1 内核驱动 修改说明 3.2 DTS配置 3.3 驱动log 3.4 测试命令 4 常见问题 1 Rockchip SPI功能特点 SPI (serial peripheral interface),以下是linux 4.4 spi驱动支持的一些特性︰ 默认采用摩托罗拉 SPI协议 支持8位和16位 软件可编程时钟频率和传输速率高达50MHz 支持SPI 4种传输模式配置 每个SPI控制器支持一个到两个片选 2 内核软件 2.1 代码路径 1 drivers/spi/spi.c 2 drivers/spi/spi‐rockchip.c rk spi各接口实现 spi驱动框架 3 drivers/spi/spidev.c 创建spi设备节点,用户态使用。 4 drivers/spi/spi‐rockchip‐test.c spi测试驱动,需要自己手动添加到Makefile编译 5 Documentation/spi/spidev_test.c 用户态spi测试工具 2.2 内核配置 1 Device Drivers 2 ‐‐‐> [*] SPI support 3 <*> ‐‐‐> Rockchip SPI controller driver 2.3 DTS节点配置 引用spi 控制器节点 1 &spi1 { 2 status = "okay"; 3 max‐freq = <48000000>; spi内部工作时钟 4 dma‐names = "tx","rx"; 使能DMA模式,一般通讯字节少于32字节的不建议用 5 spi_test@10 { 与驱动对应的名字 6 compatible ="rockchip,spi_test_bus1_cs0"; 7 reg = <0>; 8 spi‐max‐frequency = <24000000>; 9 spi‐cpha; 10 spi‐cpol; 如果有配,cpol为1,clk脚保持高电平 spi‐cs‐high; 如果有配,每传完一个数据,cs都会被拉高,再拉低 片选0或者1 spi clk输出的时钟频率,不超过50M 如果有配,cpha为1 11 spi‐cs‐high; 如果有配,每传完一个数据,cs都会被拉高,再拉低 12 status = "okay"; 使能设备节点 13 14 }; }; 一般只需配置以下几个属性就能工作了。 1 spi_test@11 { 2 compatible ="rockchip,spi_test_bus1_cs1"; 3 reg = <1>; 4 spi‐max‐frequency = <24000000>; 5 status = "okay"; 6 }; max-freq 和 spi-max-frequency的配置说明: spi-max-frequency 是SPI的输出时钟,是max-freq分频后输出的,关系是max-freq >= 2*spi-maxfrequency。 max-freq 不要低于24M,否则可能有问题。 如果需要配置spi-cpha的话, max-freq <= 6M, 1M <= spi-max-frequency >= 3M。 2.3 SPI设备驱动 设备驱动注册: 1 static int spi_test_probe(struct spi_device *spi) 2 { 3 int ret; 4 int id = 0; 5 if(!spi) 6 return ‐ENOMEM; 7 spi‐>bits_per_word= 8; 8 ret= spi_setup(spi); 9 if(ret < 0) { 10 dev_err(&spi‐>dev,"ERR: fail to setup spi\n"); 11 return‐1; 12 } 13 return ret; 14 } 15 static int spi_test_remove(struct spi_device *spi) 16 { 17 printk("%s\n",__func__); 18 return 0; 19 } 20 static const struct of_device_id spi_test_dt_match[]= { 21 {.compatible = "rockchip,spi_test_bus1_cs0", }, 22 {.compatible = "rockchip,spi_test_bus1_cs1", }, 23 {}, 24 }; 25 MODULE_DEVICE_TABLE(of,spi_test_dt_match); 26 static struct spi_driver spi_test_driver = { 27 .driver = { .name = "spi_test", 28 .name 29 .owner = THIS_MODULE, 30 = "spi_test", .of_match_table = of_match_ptr(spi_test_dt_match), 31 }, 32 .probe = spi_test_probe, 33 .remove = spi_test_remove, 34 }; 35 static int __init spi_test_init(void) 36 { 37 int ret = 0; 38 ret = spi_register_driver(&spi_test_driver); 39 return ret; 40 } 41 device_initcall(spi_test_init); 42 static void __exit spi_test_exit(void) 43 { 44 return spi_unregister_driver(&spi_test_driver); 45 } 46 module_exit(spi_test_exit); 对spi读写操作请参考include/linux/spi/spi.h,以下简单列出几个 1 static inline int 2 spi_write(struct spi_device *spi,const void *buf, size_t len) 3 static inline int 4 spi_read(struct spi_device *spi,void *buf, size_t len) 5 static inline int 6 spi_write_and_read(structspi_device *spi, const void *tx_buf, void *rx_buf, size_t len) 2.4 User mode SPI device配置说明 User mode SPI device 指的是用户空间直接操作SPI接口,这样方便众多的SPI外设驱动跑在用户空间, 不需要改到内核,方便驱动移植开发。 2.4.1 内核配置 1 2 3 Device Drivers ‐‐‐> [*] SPI support [*] 2.4.2 DTS配置 ‐‐‐> User mode SPI device driver support 1 &spi0 { 2 status = "okay"; 3 max‐freq = <50000000>; 4 spi_test@00 { 5 compatible = "rockchip,spidev"; 6 reg = <0>; 7 spi‐max‐frequency = <5000000>; 8 }; 9 }; 2.4.3 内核补丁 1 diff ‐‐git a/drivers/spi/spidev.c b/drivers/spi/spidev.c 2 index d0e7dfc..b388c32 100644 3 ‐‐‐ a/drivers/spi/spidev.c 4 +++ b/drivers/spi/spidev.c 5 @@ ‐695,6 +695,7 @@ static struct class *spidev_class; 6 static const struct of_device_id spidev_dt_ids[] = { 7 { .compatible = "rohm,dh2228fv" }, 8 { .compatible = "lineartechnology,ltc2488" }, 9 + 10 { .compatible = "rockchip,spidev" }, {}, 11 }; 12 MODULE_DEVICE_TABLE(of, spidev_dt_ids); 说明:较旧的内核可能没有2.4.1 和2.4.3 ,需要手动添加,如果已经包含这两个的内核,只要添加2.4.2即可。 2.4.4 使用说明 驱动设备加载注册成功后,会出现类似这个名字的设备:/dev/spidev1.1 请参照Documentation/spi/spidev_test.c 3 SPI 内核测试驱动 3.1 内核驱动 1 drivers/spi/spi‐rockchip‐test.c 需要手动添加编译 3.2 DTS配置 1 &spi0 { 2 status = "okay"; 3 max‐freq = <48000000>; 4 //dma‐names = "tx", "rx"; //enable dma 5 pinctrl‐names = "default"; //pinctrl according to you board 6 pinctrl‐0 = <&spi0_clk &spi0_tx &spi0_rx &spi0_cs0 &spi0_cs1>; 7 spi_test@00 { 8 //spi internal clk, don't modify compatible = "rockchip,spi_test_bus0_cs0"; id = <0>; //这个属性spi‐rockchip‐test.c用来区分不同的spi从设备的 9 id = <0>; 10 reg = <0>; 11 spi‐max‐frequency = <24000000>; 12 //spi‐cpha; 13 //spi‐cpol; low 14 //这个属性spi‐rockchip‐test.c用来区分不同的spi从设备的 //chip select 0:cs0 1:cs1 //spi output clock //not support //if the property is here it is 1:clk is high, else 0:clk is when idle }; 15 16 spi_test@01 { 17 compatible = "rockchip,spi_test_bus0_cs1"; 18 id = <1>; 19 reg = <1>; 20 spi‐max‐frequency = <24000000>; 21 spi‐cpha; 22 spi‐cpol; 23 }; 24 }; 3.3 驱动log 1 [ 0.530204] spi_test spi32766.0: fail to get poll_mode, default set 0 2 [ 0.530774] spi_test spi32766.0: fail to get type, default set 0 3 [ 0.531342] spi_test spi32766.0: fail to get enable_dma, default set 0 4 以上这几个没配的话,不用管 5 [ 0.531929] rockchip_spi_test_probe:name=spi_test_bus1_cs0,bus_num=32766,cs=0,mode=0,speed=5000000 6 [ 7 这是驱动注册成功的标志 0.532711] rockchip_spi_test_probe:poll_mode=0, type=0, enable_dma=0 3.4 测试命令 1 echo write 0 10 255 > /dev/spi_misc_test 2 echo write 0 10 255 init.rc > /dev/spi_misc_test 3 echo read 0 10 255 > /dev/spi_misc_test 4 echo loop 0 10 255 > /dev/spi_misc_test 5 echo setspeed 0 1000000 > /dev/spi_misc_test echo 类型 id 循环次数 传输长度 > /dev/spi_misc_test echo setspeed id 频率(单位Hz) > /dev/spi_misc_test 如果需要,可以自己修改测试case。 4 常见问题 调试前确认驱动有跑起来 确保SPI 4个引脚的IOMUX配置无误 确认TX送时,TX引脚有正常的波形,CLK 有正常的CLOCK信号,CS信号有拉低 如果clk频率较高,可以考虑提高驱动强度来改善信号
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : No Creator : Typora Producer : Typora Create Date : 2018:01:15 16:42:54 Modify Date : 2018:01:15 16:42:54 Page Count : 6 Page Mode : UseOutlines Warning : [Minor] Ignored duplicate Info dictionaryEXIF Metadata provided by EXIF.tools