背景介绍

基本不用官方镜像,通常给NanoPi 烧写Armbian镜像。本次使用的NanoPi Neo Core也是烧写的此固件。
NanoPi基于WiringPi这个开源库自己做了一个WiringNP库,可用来操作GPIO接口。从https://github.com/friendlyarm/WiringNP/blob/master上copy,编译安装之后。运行bash gpio readall之后。提示一下错误: [code] piBoardRev: Unable to determine board revision from /proc/cpuinfo -> Is not NanoPi based board. -> You may want to check: -> http://www.lemaker.org/ open /sys/class/sunxi_info/sys_info failed

[/code]

分析

其实这个问题已经很清晰了。尝试查找/sys/class/sunxi_info/sys_info文件失败。因此识别不了板子的型号。
最初的想法是将讲官方镜像的/sys/class/sunxi_info/sys_info拷贝过来。但是暂时手边没有安装这个文件的板子。就想着能不能找来替换一下。但是在搜索的过程中却找到了另一种方法。

解决方法

这个解决方法我的思路类似。不过这里的方法是新创建了一个新文件/etc/sys_info(我想是为了防止冲突吧)。将本该填入/sys/class/sunxi_info/sys_info的内容填写到/etc/sys_info中。

1、 添加/etc/sys_info文件

比方说Nanopi Neo应该添入的文件如下: [code] sunxi_platform : Sun8iw7p1 sunxi_secure : normal sunxi_chipid : 2c21020e786746240000540000000000 sunxi_chiptype : 00000042 sunxi_batchno : 1 sunxi_board_id : 1(0)

[/code]

2、修改boardtype_friendlyelec.c文件

然后修改WiringNP目录下的wiringPi/boardtype_friendlyelec.c文件。
搜索/sys/class/sunxi_info/sys_info会发现如下命令 [code] if (!(f = fopen(“/sys/class/sunxi_info/sys_info”, “r”))) {

        LOGE("open /sys/class/sunxi_info/sys_info failed.");
        return -1;
    }

[/code]

这行命令就是导致出错的原因。
现在的做法就是如果读不到/sys/class/sunxi_info/sys_info在让其尝试读取我们新添加的文件/etc/sys_info。
命令如下: [code] if (!(f = fopen(“/sys/class/sunxi_info/sys_info”, “r”))) {

   if (!(f = fopen("/etc/sys_info", "r"))) {
   
   
       LOGE("open /sys/class/sunxi_info/sys_info failed.");
       return -1;
   }
}

[/code]

3、针对性修改

而不同板子的添加/etc/sys_info文件的信息是不同的。上面的信息会被读取到一个结构体中: [code] typedef struct {

	char kernelHardware[255];
	int kernelRevision;
	int boardTypeId;
	char boardDisplayName[255];
	char allwinnerBoardID[255];
} BoardHardwareInfo;

[/code]

其中boardTypeId和allwinnerBoardID很重要。不同板子是不同的。
可以通过查看wiringPi/boardtype_friendlyelec.c找到。 [code] BoardHardwareInfo gAllBoardHardwareInfo[] = {

    {
   
   "MINI6410", -1, S3C6410_COMMON, "S3C6410_Board", ""},
    {
   
   "MINI210",  -1, S5PV210_COMMON, "S5PV210_Board", ""},
    {
   
   "TINY4412", [/code]