前期工作

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. LeetCode HOT 100:子集(简单易懂的回溯)

    题目:78. 子集 题目描述: 给你一个整数数组,数组中元素互不相同.返回数组中所有可能的子集,且子集不能重复! 什么是子集?举个例子:原数组[1, 2, 3],[].[1].[1, 2].[1, 3 ...

  2. [数学理论] NP问题解释

    转载自http://m.blog.csdn.net/csshuke/article/details/74909562 希望通过这篇文章可以不仅让计算机相关专业的人可以看懂和区分什么是P类问题什么是NP ...

  3. Spring项目中用了这种解耦模式,经理对我刮目相看

    前言 不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 CSV解析器或者JSON解析器,在调用的客户端一般都是用if else去做判断, ...

  4. 让 Win8.1 微软拼音新体验模式支持 Metro 应用

    内容回顾: [1]十个步骤找回 Win8 中的微软拼音新体验模式 [2]发布个工具,一键恢复Win8/8.1中的微软拼音长句模式(新体验模式) 在 [1] 中,我们找回了 Win8 里的微软拼音新体验 ...

  5. AtCoder Regular Contest 148 A - mod M

    题面 You are given a sequence \(A = (A_1, A_2, ..., A_N)\). You may perform the following operation ex ...

  6. Codeforces Round #844 (Div.1 + Div.2) CF 1782 A~F 题解

    点我看题 A. Parallel Projection 我们其实是要在这个矩形的边界上找一个点(x,y),使得(a,b)到(x,y)的曼哈顿距离和(f,g)到(x,y)的曼哈顿距离之和最小,求出最小值 ...

  7. Docker 基础 - 2

    容器操作系统类型 Busybox 集成了一百多个最常用 Linux 命令和工具的软件工具箱. 包含cat echo grep find mount telnet 等 Busybox 是Linux 系统 ...

  8. 常用的函数式接口_supplier接口-接口练习

    常用的函数式接口_supplier接口 常用的函数式接口java.util.function.SuppLier<T>接口仅包含一个无参的方法:T get().用来获取一个泛型参数指定类型的 ...

  9. 集合框架-Collection集合

    集合框架 JAVASE提供了满足各种需求的APl,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用.集合按照其存储结构可以分为两大类,分 ...

  10. 阿里云服务器中MySQL数据库被攻击

    前几天刚领了一个月的阿里云服务器玩,在里面装了MySQL,然后这几天找了个小项目练习着玩呢,就将表建在里面了. 刚访问添加员工还好好的,刚给员工分页查询呢 ,啪一下 ,很突然昂 ,就访问不了了 ,看控 ...