前期工作

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. 基于.NetCore开发博客项目 StarBlog - (25) 图片接口与文件上传

    前言 上传文件的接口设计有两种风格,一种是整个项目只设置一个接口用来上传,然后其他需要用到文件的地方,都只存一个引用ID:另一种是每个需要文件的地方单独管理各自的文件.这俩各有优劣吧,本项目中选择的是 ...

  2. [编程基础] C++多线程入门1-创建线程的三种不同方式

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 1 创建线程的三种不 ...

  3. Ubuntu snap 下载慢

    解决方法 sudo apt-get install snapd sudo snap install snap-store sudo snap install snap-store-proxy sudo ...

  4. 《《关于我把好好的c++小游戏改的很ex》》

    #undef UNICODE#undef _UNICODE#include <iostream>#include <iomanip>#include <string> ...

  5. 绝对路径和相对路径-file类的构造方法

    绝对路径和相对路径 路径:绝对路径:是一个完整的路径以盘符(c:,D:)开始的路径c:lla.txtC; llUserslitcastllIdeaProjects 1lshungyuan {\123. ...

  6. SpringBoot学习笔记 - 构建、简化原理、快速启动、配置文件与多环境配置、技术整合案例

    [前置内容]Spring 学习笔记全系列传送门: Spring学习笔记 - 第一章 - IoC(控制反转).IoC容器.Bean的实例化与生命周期.DI(依赖注入) Spring学习笔记 - 第二章 ...

  7. [USACO17JAN]Cow Dance Show S更新ing

    这道题目是二分舞台大小,为什么能用二分呢?因为如果mid成立 则mid~r都成立,如果mid不成立l~mid就都不成立,也就是严格单调,所以可以使用二分快速找到k. check函数的思路: 实现:在舞 ...

  8. 搭个ChatGPT算法模型,离Java程序员有多远?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 最近 ChatGPT 很火,火到了各行各业.记得去年更多的还是码农最新体验后拿它搜代码,现在各 ...

  9. BIO和NIO的基本用法和API讲解

    1 BIO 可以理解为Blocking IO 是同步阻塞的IO,也就是说,当有多个请求过来的时候,请求会呈现为链状结构,遵循先进先出的原则 1.1 单线程版本 1.1.1 服务端 //服务端单线程处理 ...

  10. spring cloud alibaba - Nacos 作为注册中心基础使用-服务提供者和消费者

    1.概况 服务提供者9001和9002,他们是同一个服务,服务消费者83 2.创建服务提供者 9001和9002除了端口是一样的,这里只演示一个 2.1项目结构 2.2依赖 nacos依赖 <d ...