前期工作

orangepi 3 lts使用全志的H6芯片,通过查询该芯片的datasheet和user manual,可以发现H6有两个scr接口,分别为scr0和scr1,理论上是支持读卡器接口的,现在的问题是orangepi 3 lts是否将该接口引出来。



继续查询官方提供的板子原理图《orange_pi_3_LTS_原理图_v1.4》,可以发现scr1的部分管脚已经引出到26pins的扩展管脚中,并且引出的管脚足以满足读卡器的正常使用。通过下图可以看到SCR1的clk、data、rst管脚已经引到PH3、PH4、PH5中。



在管脚接线图下图可以看PH3、PH4、PH5、PH6管脚已经默认分配给SPI了,如何将已经分配给SPI的管脚分配给SCR1呢?在H6中,大多管脚是多个功能模块共用,即若将PH3、PH4、PH5、PH6分配给SCR1,则无法使用SPI功能,见下图。

修改设备树

现在,需要先关闭SPI模块,以下操作仅以linux4.9为准。orangepi官方提供debian有4.9和5.10,其中5.10设备树新增了overlay功能,SPI默认关闭,而4.9则需要修改手动设备树。将spi@05011000节点中的status字段改为disabled即可。

spi@05011000 {
#address-cells = <0x1>;
#size-cells = <0x0>;
compatible = "allwinner,sun50i-spi";
device_type = "spi1";
reg = <0x0 0x5011000 0x0 0x1000>;
interrupts = <0x0 0xb 0x4>;
clocks = <0x2 0x73>;
clock-frequency = <0x5f5e100>;
pinctrl-names = "default", "sleep";
spi1_cs_number = <0x1>;
spi1_cs_bitmap = <0x1>;
status = "disabled";
pinctrl-0 = <0xfc 0xfd>;
pinctrl-1 = <0xfe 0xff>; spi_board0 {
device_type = "spi_board0";
compatible = "rohm,dh2228fv";
spi-max-frequency = <0x124f80>;
reg = <0x0>;
};
};

现在,还需将scr模块启用。找到smartcard@0x05005400节点并将节点改为如下所示。这里讲一下为什么不是直接将status字段改为okay就行了。之前说过,只有部分scr的管脚被引出到26pins中,其他scr管脚PH0、PH1、PH2中,PH2没有被引出,而PH0、PH1被引到了调试串口的管脚上,即板子上三个管脚连在一起的那个地方。如果把PH0、PH1绑定到scr中,调试串口就无法使用了,这不是一个好的点子,并且PH0、PH1并不影响scr的正常使用,仅在SIM编程时需要用到。所以设备树还需要需改一下管脚关联属性,使其与PH0和PH1解绑。

smartcard@0x05005400 {
#address-cells = <0x1>;
#size-cells = <0x0>;
compatible = "allwinner,sunxi-scr";
device_type = "scr1";
reg = <0x0 0x5005400 0x0 0x400>;
interrupts = <0x0 0x9 0x4>;
clocks = <0xb2 0xae>;
clock-frequency = <0x16e3600>;
//pinctrl-names = "default", "sleep";
pinctrl-names = "default";
//pinctrl-0 = <0xb3 0xb4>;
pinctrl-0 = <0xb3>;
//pinctrl-1 = <0xb5>;
status = "okay";
};

设备树修改完成后,需要重新编译一下并覆盖原来的设备树(/boot/dtb/sunix/sun50i-h6-orangepi-3-lts.dtb)。编译命令如下。覆盖后就可以重启等待设备树生效。

dtc -I dts -O dtb -o sun50i-h6-orangepi-3-lts.dtb sun50i-h6-orangepi-3-lts.dts

设备树生效后,理论上在/dev目录下可以看到smartcard设备节点。

scr驱动

现在系统已经识别到设备了,还需要相应的驱动才能正常工作。一开始在查看linux 5.10的源码时,并没有发现相应的scr驱动,打算自己对照datasheet写一份简单的驱动。后来由于某种原因,我将orangepi上的系统换成了4.9,并在4.9的源码中找到了scr驱动,并且4.9系统已经自带编译好的驱动,一旦系统识别到scr设备就会自动加载该驱动。使用lsmod命令看一下已经加载的驱动,正好发现scr.ko已经被加载,现在可以对/dev/smartcard进行读写操作了。

SIM模块

现在软件端已经准备就绪,就差硬件端。从淘宝上买个SIM卡座转接板和几根杜邦线。



按照H6的datasheet和orangepi的原理图,连接对应管脚(对应关系见上面管脚接线图)。注意,我买的SIM卡座没有detect管脚,该管脚用于检测SIM是否插入,所以直接将该管脚接地即可。



接下来就是让人迫不及待的测试,经过相应的测试,在orangepi 3 lts上使用读卡器设备是完全可行的。相关代码在点击此处。

后记

以上所有实验均在orangepi 3 lts板子上进行,使用的操作系统是官方提供debian linux4.9。至于debian linux5.10应该也是可行的,可以把4.9的scr.ko放到5.10使用,而且5.10可以使用更为方便的overlay功能来修改设备树。至于其他型号的orangepi,只要是全志H6,管脚引出没问题,根据以上流程也是可行的。而使用其他核心soc的板子,则要查阅datasheet是否支持scr。

在orangepi 3 lts上使用SmartCardReader(读卡器)的更多相关文章

  1. 在Ubuntu 16.04 LTS上用g++和gcc编译C/C++代码错误提示“.../x86_64-linux-gnu/crt1.o: ELF section name out of range”

    (有一些图片我是直接从个人的CSDN博客上复制来的) 最近一个多月来,我曾经多次尝试在Ubuntu 16.04 LTS上使用g++和gcc(这俩好像合起来叫MinGW?)来编译C/C++代码,但是在解 ...

  2. 如何在Ubuntu 18.04 LTS上安装和配置MongoDB

    MongoDB是一款非关系型数据库,提供高性能,高可用性和自动扩展企业数据库. MongoDB是一个非关系型数据库,因此您不能使用SQL(结构化查询语言)插入和检索数据,也不会将数据存储在MySQL或 ...

  3. Ubuntu 16.04 LTS上git提交出现警告Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts. 的解决方法

    问题: Ubuntu 16.04 LTS执行 git pull时总会出现以下警告: Warning: Permanently added 'github.com,52.74.223.119' (RSA ...

  4. Ubuntu 12.04.5 LTS 上安装hadoop 2.6.0后运行自带的例程wordcount

    注:我所有的操作均通过Xshell 5远程连接Ubuntu进行实施 第一步:启动hadoop,利用jps查看hadoop是否已经启动,如果没有启动用start-dfs.sh脚本启动(hadoop2.X ...

  5. OpenCL科普及在ubuntu 16.04 LTS上的安装

    OpenCL(Open Computing Language,开放计算语言)是一个为异构平台编写程序的框架,此异构平台可由CPU.GPU.DSP.FPGA或其他类型的处理器與硬體加速器所组成.Open ...

  6. Ubuntu16.04 LTS上安装Go1.10

    原因 Ubuntu资源库上默认使用的是Go1.6.2版本,给最新版本代码编译带来了不少问题.本文就记录下在Ubuntu下直接安装Go最新版1.10的步骤. 准备工作 1.卸载已有版本 # 卸载已经安装 ...

  7. 在 Ubuntu 16.04 LTS 上 离线安装 Docker / Docker-compose

    前情提要 今天上班后,突然接到现场的工程师的电话: XXX的现场环境组的的局域网,上不了互联网.bla bla bla..... 如果需要安装其他软件的话,只能是自己带过去安装... 听完现场工程师的 ...

  8. 在 Ubuntu 16.04 LTS 上安装 Python 3.6.0

    原文连接:https://segmentfault.com/a/1190000007912666 最近 Python 3 发布了新版本 Python 3.6.0,好像又加入了不少黑魔法!- 由于暂时不 ...

  9. 【转】如何在Ubuntu 14.04 LTS上设置Nginx虚拟主机

    介绍 转自http://www.pandacademy.com/%E5%A6%82%E4%BD%95%E5%9C%A8ubuntu-14-04-lts%E4%B8%8A%E8%AE%BE%E7%BD% ...

  10. Ubuntu 18.04 LTS上安装NFS服务器和客户端

    NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器.操作系统以及低层传送协议无关的存取远程文件的操作.RPC采用了XDR的支持.XDR是一种与机器无关的 ...

随机推荐

  1. Jmeter ForEach 循环控制器

    ForEach Controller 即循环控制器,顾名思义是定义一种循环规则,如下图: 1.名称:控制器名称,可根据用户需要任意填写,也可不填 2.注释:用户可根据需要任意填写,也可不填 3.输入变 ...

  2. uniapp input框聚焦时软键盘弹起整个页面上滑,固定页面不让上滑问题

    根据需求,软键盘弹起时,不允许页面整体向上滑动 用到的属性是:  :adjust-position="false" uni-app 软键盘顶起底部fixed定位的输入框 页面就不会 ...

  3. Flask初步认识

    1.Flask基本认识 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展包(数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现.比如可以用 Flask 扩展加入ORM. ...

  4. go语言的切片特性

    概述: 在使用切片进行赋值的时候,产生新的数组的指针指向原来的数组,只要修改新数组中的元素时,原来数组的元素也会改变. 测试代码: func TestSliceShareMemory(t *testi ...

  5. JUC基础学习笔记

    JUC的理解: JUC即java.util .concurrent工具包的简称.从JDK 1.5 开始出现,主要用于处理多线程.高并发问题. 多线程的三大特征解析 原子性.可见性.有序性 1.原子性: ...

  6. [python] 基于Gradio可视化部署机器学习应用

    Gradio是一个开源的Python库,用于构建机器学习和数据科学演示应用.有了Gradio,你可以围绕你的机器学习模型或数据科学工作流程快速创建一个简单漂亮的用户界面.Gradio适用于以下情况: ...

  7. 【Python】pip的镜像安装异常解决方案

    在安装pip的出现异常提示: ERROR: Could not find a version that satisfies the requirement pillow (from versions: ...

  8. 如何在Github上创建一个新仓库

    Hi,欢迎大家在有空的时候做客[江涛学编程],这里是2023年的第6篇原创文章,新年新气象,在这里我祝读者朋友们都好好的, 老规矩,拍拍手,上菜. 今天没有啥东西要跟家人们分享,就两个字,看图!!! ...

  9. tornado原理介绍及异步非阻塞实现方式

    tornado原理介绍及异步非阻塞实现方式 以下内容根据自己实操和理解进行的整理,欢迎交流~ 在tornado的开发中,我们一般会见到以下四个组成部分. ioloop: 同一个ioloop实例运行在一 ...

  10. 数学 in OI-数论-1

    数论 \(1\) \(1.\) 质数 定义就不说了吧. 性质 \(\&\) 定理 质数 \(p\) 有且仅有两个质因子 \(1\) 和 \(p\) . 质数有无穷个. \([1,\, n]\) ...