• OneCloud记录


    配置信息

    S805, 1G RAM, 8G ROM, USB2.0 * 2, 1GB LAN, SD Cardreader
    S805参数: 32-bit, ARMv7-A, Cortex-A5, 1.5GHz 4核. 这个不是64位的CPU.

    原生玩客云刷机的步骤

    因为玩客云原生系统uboot无法输入命令,且启动后TTL终端需要用户登录, 所以需要先将带uboot的固件刷入

    刷入安卓电视盒

    在这个固件刷入后,才能在uboot菜单输入命令让盒子从SD和USB启动。

    • 拆开盒子,取出PCB板,焊上TTL
    • 电脑上安装USB_Burning_Tool_v2.1.6,注意系统不能是Win10英文版,这个版本读取镜像会有问题, 换成Win7就没问题
    • 运行USB Burning Tool,连接USB双公头到靠近HDMI的USB口,短接触点,PCB板上电,此时在USB Burning Tool中能看到出现的新设备
    • 选择inphic_firmware_v1.img或inphic_firmware_v2.img,点击开始刷机
      • V2是沙发桌面,V1是另一种不常见的桌面,都是源自同一固件制作的
      • 固件都未ROOT,需要自行ROOT
    • 如果是第一次安装USB Burning Tool,第一次连接,刷机可能会失败,因为在3%或4%这步PCB重启时驱动反应较慢会超时,再来一次就好了
    • 刷入成功后,拔掉USB双公头线,拔电重启

    用SD/TF卡运行Armbian

    • 解开 Armbian_5.74_Aml-s805_Ubuntu_bionic_default_3.10.108_20190205
    • 用USBWriter.exe将镜像写入U盘或SD/TF卡
    • TTL线连接PCB板,电脑上用XShell打开SERIAL连接
      • 在Win10下,P2302需要安装旧版的驱动,否则不能用
    • 加电,出现输出后立即拍空格,出现UBOOT提示符,输入下面的命令

    第一组

    # set env
    setenv bootfromrecovery 0
    setenv bootfromnand 0
    setenv start_mmc_autoscript 'if fatload mmc 0 11000000 s805_autoscript; then autoscr 11000000; fi;'
    setenv start_usb_autoscript "if fatload usb 0 11000000 s805_autoscript; then autoscr 11000000; fi; if fatload usb 1 11000000 s805_autoscript; then autoscr 11000000; fi;"
    
    setenv start_autoscript 'if usb start; then run start_usb_autoscript; fi; if mmcinfo; then run start_mmc_autoscript; fi;'
    setenv bootcmd 'run start_autoscript; run storeboot'
    # setenv firstboot 1
    saveenv
    

    第二组

    # set env
    setenv bootfromrecovery 0
    setenv bootfromnand 0
    setenv bootcmd 'run start_autoscript; run storeboot'
    setenv start_autoscript 'if mmcinfo; then run start_mmc_autoscript; fi; if usb start; then run start_usb_autoscript; fi; run start_emmc_autoscript;'
    setenv start_emmc_autoscript 'if fatload mmc 1 11000000 emmc_autoscript; then autoscr 11000000; fi;'
    setenv start_mmc_autoscript 'if fatload mmc 0 11000000 s805_autoscript; then autoscr 11000000; fi;'
    setenv start_usb_autoscript 'for usbdev in 0 1 2 3; do if fatload usb ${usbdev} 11000000 s805_autoscript; then autoscr 11000000; fi; done'
    saveenv
    

    上面任一组都可以,然后用这个命令检查

    # show env
    printenv
    

    然后拔电,插上已经写入Armbian镜像的SD卡,或者U盘,U盘必须用靠近网口那个USB口, 然后加电, 就会启动进入Armbian

    注意:

    • 如果是用SD卡套的TF卡,注意这个读卡器比较挑,有些卡套不识别。
    • 启动后先出安卓的LOGO,然后黑屏,然后才会有命令行输出, 有些Armbian镜像只有TTL输出,没有HDMI输出
    • 国内制作的部分Armbian镜像, 必须用Windows下的USBWriter写入, 如果用Linux下的Disk Writer, 会导致uboot无法识别U盘的分区而导致读取USB中的启动脚本失败.

    更新UBOOT

    准备一张格式化为Fat32的分区小于512M的SD卡, 新的u-boot.bin放这个卡上, 在启动时进入uboot界面, 插入SD卡, 输入以下命令

    # 启动mmc
    mmcinfo
    # 将u-boot.bin这个文件从mmc 0读出, 放到内存开始地址为12000000的地方
    # 注:u-boot.bin 为 u-boot 的名字,如果名字不一样,需要作相应的更改。
    fatload mmc 0 12000000 u-boot.bin
    # 将12000000的内容 写入到rom的 0 60000 地址区间
    store rom_write 12000000 0 60000
    # 断电重启
    

    修改autoscript

    有时候镜像中的s805_autoscript设置得不对导致启动失败,需要修改. 直接修改s805_autoscript, 会导致启动时校验失败, 需要用mkimage工具重新生成, 命令历史如下

    $ mkimage -l s805_autoscript
    GP Header: Size 27051956 LoadAddr 7c441e58
    $ mv s805_autoscript s805_autoscript.bak
    $ mkimage -A arm -O linux -T script -C none -d s805_autoscript.cmd s805_autoscript
    Image Name:   
    Created:      Sun Dec 27 21:28:00 2020
    Image Type:   ARM Linux Script (uncompressed)
    Data Size:    1284 Bytes = 1.25 KiB = 0.00 MiB
    Load Address: 00000000
    Entry Point:  00000000
    Contents:
       Image 0: 1276 Bytes = 1.25 KiB = 0.00 MiB
    
    $ mkimage -l s805_autoscript
    Image Name:   
    Created:      Sun Dec 27 21:28:00 2020
    Image Type:   ARM Linux Script (uncompressed)
    Data Size:    1284 Bytes = 1.25 KiB = 0.00 MiB
    Load Address: 00000000
    Entry Point:  00000000
    Contents:
       Image 0: 1276 Bytes = 1.25 KiB = 0.00 MiB
    

    对于一些只能从USB启动的img, 可以通过修改s805_autoscript的方式让其通过SD卡槽也能启动, 对于玩客云, 修改s805_autoscript.cmd中的这一行, 将 mmc 1 都改为 mmc 0, 因为玩客云只有mmc 0

    if fatload mmc 1 ${kernel_addr} uImage; then if fatload mmc 1 ${initrd_addr} uInitrd; then if fatload mmc 1 ${env_addr} uEnv.txt; then env import -t ${env_addr} ${filesize};fi; if fatload mmc 1 ${dtb_addr} ${dtb_name}; then unifykey get mac;setenv bootargs ${bootargs} mac=${mac};run boot_start; else imgread dtb boot ${dtb_addr}; run boot_start;fi;fi;fi;
    

    然后再用前面的命令,将s805_autoscript.cmd转化为s805_autoscript, 代替原文件,就可以从SD卡槽启动了.

    其他的Armbian版本

    目前能下载的Armbian镜像, 普遍存在两个问题: 网卡不能正常工作, HDMI没有输出. 这两者正常的只有3.10.108这个内核的版本.
    内核是5.x的现在还没见到HDMI正常工作的, 因为可以从TTL进行配置, 所以如果仅作为服务器使用, 这样也可以接受.

    修复网卡:
    对于balbes150提供的内核为5.7.0以后的版本,都可以用替换dtb的方式修复网卡.
    用这里提供的meson8b-odroidc1.dtb文件,替换掉镜像里的同名文件,并修改 uEnv.txt 文件设置为这个dtb, 就可以启动为千兆网卡

    遇到的问题:

    1. Debian Buster版本中,用iptables命令出现"iptables-legacy tables present, use iptables-legacy to see them"提示
      这是因为Buster已经更换了新的iptables实现,具体看这个链接 https://wiki.debian.org/iptables
      NOTE: Debian Buster uses the nftables framework by default.
      Starting with Debian Buster, nf_tables is the default backend when using iptables, by means of the iptables-nft layer (i.e, using iptables syntax with the nf_tables kernel subsystem). This also affects ip6tables, arptables and ebtables.
      You can switch back and forth between iptables-nft and iptables-legacy by means of update-alternatives (same applies to arptables and ebtables).
      The default starting with Debian Buster:
    # update-alternatives --set iptables /usr/sbin/iptables-nft
    # update-alternatives --set ip6tables /usr/sbin/ip6tables-nft
    # update-alternatives --set arptables /usr/sbin/arptables-nft
    # update-alternatives --set ebtables /usr/sbin/ebtables-nft
    

    Switching to the legacy version:

    # update-alternatives --set iptables /usr/sbin/iptables-legacy
    # update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
    # update-alternatives --set arptables /usr/sbin/arptables-legacy
    # update-alternatives --set ebtables /usr/sbin/ebtables-legacy
    

    参考以下的链接
    Armbian S805相关讨论
    https://forum.armbian.com/topic/1919-armbian-for-amlogic-s805/
    上面这个主题的后续讨论,因为“Now images for S805 and S802S812 are shared with core 5”
    https://forum.armbian.com/topic/3023-armbian-for-amlogic-s805-and-s802s812/
    在另一个论坛的讨论
    https://forum.freaktab.com/forum/tv-player-support/amlogic-based-tv-players/606133-linux-images-for-s802-s805-s812-s905-s905x-s912-sd-usb-emmc

    s805s802s812
    
    Thanks to the work done by Martin and the developers of Libreelec (Chewitt etc). An early alpha version of Libreelec with a 5.6 core is now available.This version is intended for General evaluation of the system's ability to run on s805s802s812. This version uses a new DTB configuration mechanism that is common with the latest Armbian versions for all RK+AW+AML platforms. You need to edit the file to configure it (uEnv.txt). If multi-loading is already enabled on your device, the system should start automatically after setting up DTB.
    

    https://yadi.sk/d/2TMsShn0sgvsOA

    Armbian S8xx下载 from balbes150, 这些是5.x内核使用新的dtb后整合S805,S812的镜像
    https://yadi.sk/d/-MwoNitZonsRCg

    Armbian S805下载
    https://yadi.sk/d/QCGU0PIv3G5kEa
    Armbian S805下载
    https://yadi.sk/d/DnCkh3KBvAFES
    玩客云的下载 -- 这些国内自行编译的镜像, 必须在windows下用USBWriter写入才行, 如果在Linux下用disk writer,在uboot中会无法识别U盘的分区导致引导失败
    https://yadi.sk/d/3HM6lyepys95Tg

    参考链接

    https://zhuanlan.zhihu.com/p/144850658
    https://1syan.com/read/39.html
    https://www.xiaowenweb.com/fl/770/3/
    https://post.smzdm.com/p/akmg53qr/
    https://www.mydigit.cn/forum.php?mod=viewthread&tid=174374

    https://www.right.com.cn/forum/thread-4023909-1-1.html
    https://www.right.com.cn/forum/thread-2803127-1-1.html
    https://www.right.com.cn/forum/thread-4031647-1-1.html
    英菲克固件带root
    https://www.right.com.cn/forum/thread-4034368-1-1.html

    https://www.right.com.cn/forum/thread-4034559-1-3.html
    https://www.right.com.cn/forum/thread-837057-1-1.html

    相关下载
    https://pan.baidu.com/s/1RNBZGNbM1ZubrRuSegZ4kQ 提取码:okts
    https://cloud.189.cn/t/Z3a6jmYviYzu 访问码:aib8
    https://pan.baidu.com/s/12c2tQ3w6ncgnfI9BclSBdA 提取码:7ab0
    https://pan.baidu.com/s/1G5GWvkG-9oR1Nx1auVJqgQ 提取码:g7mt

    通过程序控制三色灯的亮灭

    前面的灯虽然只有一个,但是有三种颜色红绿蓝,通过两两组合还可以产生紫黄青白一共七种颜色. 对灯的控制是通过GPIO实现的.
    如何查看GPIO信息可以参考 https://docs.khadas.com/zh-cn/vim3/HowToAccessGpio.html

    对应这个设备的C代码

    #include <ctype.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/select.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <sched.h>
    #include <string.h>
    
    #define PLPM_BASE 0xc8100014
    
    #define __IO volatile
    
    void          *var_addr_satr=0;
    unsigned int   var_addr_size=0;
    unsigned int  *gpioaddr;
    void          *gpio_base= 0;
    
    int gpio_init(void) {
      int fd;
      unsigned int addr_start,addr_offset;
      unsigned int PageSize,PageMask;
    
      fd = open("/dev/mem",O_RDWR);
      if(fd < 0) {
        return -1;
      }
     
      PageSize = sysconf(_SC_PAGESIZE);
      PageMask = ~(PageSize-1);
     
      //printf("take PageSize=%d
    ",PageSize);
      addr_start =  PLPM_BASE & PageMask ;
      addr_offset=  PLPM_BASE & ~PageMask;
    
      var_addr_size =  PageSize*2;
      var_addr_satr = (void*) mmap(0, var_addr_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr_start);
    
      if(var_addr_satr == MAP_FAILED) {
        return -1;
      }
    
      gpio_base = var_addr_satr;
      gpio_base += addr_offset;
    
      //printf("take var addr = 0x%8x
    ",(unsigned int)var_addr_satr);
      //printf("make gpio_base = 0x%8x
    ",(unsigned int)gpio_base);
    
      close(fd);
      return 0;
    }
    
    int gpio_deinit(void) {
      int fd;
    
      fd = open("/dev/mem",O_RDWR);
      if(fd < 0) {
        return -1;
      }
    
      if(munmap(var_addr_satr,var_addr_size) == 0) {
          //printf("remove var addr ok
    ");
      } else {
      	//printf("remove var addr erro
    ");
      }
    
      close(fd);
      return 0;
    }
    
    void red_on(void) {
      unsigned int temp;
      temp = *(gpioaddr+4)|0x00040000;
      *(gpioaddr+4)=temp;
    }
    void red_off(void) {
      *(gpioaddr+4) = *(gpioaddr+4)&(~0x00040000);
    }
    void red_toggle(void) {
      unsigned char c;
      c = (*(gpioaddr+4)&0x00040000)>>18;
      if (c == 0) {
        red_on();
      } else {
        red_off();
      }
    }
    
    void green_on(void) {
      *(gpioaddr+4) = *(gpioaddr+4)|0x00080000;
    }
    void green_off(void) {
      *(gpioaddr+4) = *(gpioaddr+4)&(~0x00080000);
    }
    void green_toggle(void) {
      unsigned char c;
      c = (*(gpioaddr+4)&0x00080000)>>19;
      if (c == 0) {
        green_on();
      } else {
        green_off();
      }
    }
    
    void blue_on(void) {
      *(gpioaddr+4) = *(gpioaddr+4)|0x00100000;
    }
    void blue_off(void) {
      *(gpioaddr+4) = *(gpioaddr+4)&(~0x00100000);
    }
    void blue_toggle(void) {
      unsigned char c;
      c = (*(gpioaddr+4)&0x00100000)>>20;
      if (c == 0) {
        blue_on();
      } else {
        blue_off();
      }
    }
    
    unsigned char key_scan(void) {
      unsigned char key=0;
      key=((*(gpioaddr+5)&0x00000020)>>5);
      return key;
    } 
    
    int main(int argc,char * argv[]) {
      if (argc < 2 || argc > 4) {
        printf("led [red|green|blue] [0|1]
    ");
        return 1;
      }
    
      unsigned int temp;
      if (gpio_init() != 0) {
        printf("gpio_init failed
    ");
        return -1;
      }
    
      gpioaddr = (unsigned int *)gpio_base;
      // Turn off GPIOAO_4,GPIOAO_5 reuse 
      temp = *gpioaddr&(~0x01800066);
      *gpioaddr = temp;
      // Enable GPIOAO_2,GPIOAO_3,GPIOAO_4 output,GPIOAO_5 input
      temp = *(gpioaddr+4)&(~0x0000001c);
      *(gpioaddr+4) = temp;
    
      temp = *(gpioaddr+4)|0x00000020;
      *(gpioaddr+4) = temp;
    
      if (argc == 2) {
        if (strcmp((const char*)argv[1],"red")==0)
          red_toggle();
    
        if (strcmp((const char*)argv[1],"green")==0)
          green_toggle();
    
        if (strcmp((const char*)argv[1],"blue")==0)
          blue_toggle();
      }
    
      if (argc == 3) {
        if (strcmp((const char*)argv[1],"red")==0) {
          if (strcmp((const char*)argv[2],"0")==0) {
            red_off();
          } else {
            red_on();
          }
        }
    
        if (strcmp((const char*)argv[1],"green")==0) {
          if (strcmp((const char*)argv[2],"0")==0) {
            green_off();
          } else {
            green_on();
          }
        }
    
        if (strcmp((const char*)argv[1],"blue")==0) {
          if (strcmp((const char*)argv[2],"0")==0) {
            blue_off();
          } else {
            blue_on();
          }
        }
      }
    
      gpio_deinit( );
      return 0;
    }
    

    编译和使用

    # 编译
    gcc led.c -o led
    # 触发红色亮灭
    ./led red
    # 关闭红色
    ./led red 0
    # 打开红色
    ./led red 1
    

    如果将其放入 /usr/bin, 再将命令添加到 /etc/rc.loacl, 放到 exit 0 之前, 就能实现启动结束后变色的效果

    # By default this script does nothing.
    
    # Switch led to green to indicate the systemd has been started
    /usr/bin/onecloud_led red 0
    /usr/bin/onecloud_led blue 0
    /usr/bin/onecloud_led green 1
    
    exit 0
    
  • 相关阅读:
    python出现local variable 'f' referenced before assiginment""
    使用Python修改ifcfg-eth0文件
    在linux中运行py文件时,及时知道错误信息
    分词结果准确率、召回率计算-python
    oozie工作流
    combiner hadoop
    Python常用模块--base64
    Python常用模块--datetime
    树莓派(Raspbian系统)中使用pyinstaller封装Python代码为可执行程序
    LeetCode刷题笔记--Python--28. 实现strStr()
  • 原文地址:https://www.cnblogs.com/milton/p/14191852.html
Copyright © 2020-2023  润新知