土斯 发布的文章

lua mqtt透传部分

module(...,package.seeall)

require"utils"
require"pm"
require"sys"
require"mqtt"
require"mqttOutMsg"
require"mqttInMsg"
require "misc"
local UART_ID = 1
local mqttc22

local torigin =
{
    SERVERIP = "182.92.223.22",
    PORT = "1883",
    DEVICEID = "7735d490-4231-11ec-8470-1bf471b2fd10",
    TOKEN = "pWIUd6QEfKl0YUqIiDFj",
}
local function writevalw(filename,value)
    local filehandle = io.open(filename,"w")
    if filehandle then
        filehandle:write(value)
        filehandle:close()
    else
        print("文件不存在或文件输入格式不正确")
    end
end
local function deletefile(filename)
    os.remove(filename)
end
function split(input, delimiter,index)
    input = tostring(input)
    local pos = 0
    local i = 0
    for st,sp in function() return string.find(input, delimiter, pos, true) end do
        if (i==index) then return string.sub(input, pos, st - 1) end
        i= i + 1
        pos = sp + 1
    end
    if i==index then return string.sub(input, pos) end
    return nil
end
local function save()
    local jsondata = json.encode(torigin)
    writevalw("/user_config.txt",jsondata)
    log.info("save", "ok")
end
local function read()
    local USER_CONFIG=io.readFile("/user_config.txt")
    local cfgdata,result,errinfo = json.decode(USER_CONFIG)
    torigin=cfgdata
    log.info("save", "ok")
end
local function proc(data)
    if not data or string.len(data) == 0 then return end
    log.info("testUart.read",data)
    local a=split(data, " ",0)
    local b=split(data, " ",1)
    local c=split(data, " ",2)
    if(a=="set")
    then
        if(b=="serverip")then torigin["SERVERIP"]=c end
        if(b=="deviceid")then torigin["DEVICEID"]=c end
        if(b=="token")then torigin["TOKEN"]=c end
        uart_write(data)
    end
    if(a=="config")
    then
        if(b=="save") then save()  uart_write("save ok") end
        if(b=="read") then read()  uart_write("read  ok") end 
    end
    if(a=="print")
    then
        local jsondata = json.encode(torigin)
        log.info("jsondata", jsondata)
    end
    log.info(a,b,c)
    
end


local function read()
    local data = ""
    while true do        
        data = uart.read(UART_ID,"*l")
        if not data or string.len(data) == 0 then break end
        proc(data)
    end
end

function uart_write(s)
    log.info("testUart.write",s)
    uart.write(UART_ID,s.."\r\n")
end

local function writeOk()
    log.info("testUart.writeOk")
end


read()
pm.wake("testUart")

local port_mode=0-- 这里改成实际读取的pin脚值
if(port_mode==0) 
then
    uart.on(UART_ID,"receive",read)
    uart.on(UART_ID,"sent",writeOk)
    uart.setup(UART_ID,115200,8,uart.PAR_NONE,uart.STOP_1)
end
local revice_data=nil
local function read2()
    local data = ""
    while true do        
        data = uart.read(UART_ID,"*l")
        if not data or string.len(data) == 0 then break end
        log.info("tag", data)
        revice_data=data
    end
end


if(port_mode==1)
then
sys.taskInit(function()
    while not socket.isReady() do sys.wait(1000) log.info(".") end
    log.info("连接上网络")
    sys.wait(2000)
    mqttc2 = mqtt.client(misc.getImei(),300,torigin["TOKEN"])
    log.info("连接上服务器ing")
    while not mqttc2:connect(torigin['SERVERIP'], 1883) do sys.wait(2000) end
    log.info("连接上服务器")
    if mqttc2:subscribe("v1/devices/me/rpc/request/+") then log.info("订阅成功") end
    uart.on(UART_ID,"receive",read2)
    uart.on(UART_ID,"sent",writeOk)
    uart.setup(UART_ID,115200,8,uart.PAR_NONE,uart.STOP_1)
    while true do
        result,data = mqttc2:receive(500,"APP_SOCKET_SEND_DATA")
        if result then
            log.info("mqttInMsg.topic",data.topic)
            log.info("mqttInMsg.payload",data.payload)
            uart_write(data.payload)
        end
        if(revice_data)then
            mqttc2:publish("v1/devices/me/telemetry",revice_data)
            revice_data=nil
        end
    end
    mqttc2:disconnect()
end)
end

gerrit 认证总是提示输入密码的问题解决

  1. 首先登陆gerrit 注册(激活)自己的账号。
  2. 生成SSH KEY。 run ssh-keygen -t dsa -b 1024 。 提示Enter file in which to save the key: 输入任意一文件名(例如id_dsa)。 提示Enter file in which to save the key, 连续输入两次回车。 ls /home 或者 /.ssh 。 可以发现俩文件。 id_dsa 和 id_dsa.pub. 前者是密钥,后者是公钥.
  3. 添加public key到gerrit。 打开id_isa.pub, 复制内容。进入 gerrit->settings->SSH Publick key->add key, 粘贴公钥内容。点击add。
  4. 修改 id_dsa id_dsa.pub .ssh 的权限. chmod 700
  5. 尝试 ssh -p 29418 @gerrit......com. 如果看到 下面文字表示成功。
    Welcome to Gerrit Code Review **

    Hi xxx, you have successfully connected over SSH.
    Unfortunately, interactive shells are disabled.
    To clone a hosted Git repository, use:
    可能遇到的问题。

  6. 提示 could not create directory .ssh... 原因可能是你的cygwin 环境没有初始化。 从开始菜单打开cygwin, 会看到会有一些初始化的工作。
  7. 如果遇到Permission denied (publickey). 那可能是你没有添加密钥到ssh-agent. 尝试ssh-add id_dsa. 在add的时候如果遇到Could not open a connection to your authentication agent. 尝试ssh-agent bash. 然后再 ssh-add. add 成功后再run ssh -p 29418 @gerrit......com 应该就可以看到 welcome的提示了。
    3、测试了如上方法都不行依然提示 权限错误或者其他错误,看到协议使用ssh 不妨想到 ssh 终端连接 两个协议应该一样,便 使用xshell 使用证书方式连接 果不其然 可以连接上微信截图_20211112105715.png
    但是 。。。无法克隆 遂 再找到sourcetree 添加ppk 证书 再在 gerrit 服务器提交 微信截图_20211112105825.png
    ok 可以下拉了,但是无法上传 应该是审核问题

海思Hi3516CV500 拷贝失败 只能重新编译系统遇到得坑记录

arch=arm
baudrate=115200
board=hi3516cv500
board_name=hi3516cv500
bootargs=mem=256M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 rw mtdparts=hinand:1M(boot),4M(kernel),120M(rootfs)
bootcmd=nand read 0x82000000 0x100000 0x400000;bootm 0x82000000
bootdelay=2
cpu=armv7
ethact=eth0
soc=hi3516cv500
stderr=serial
stdin=serial
stdout=serial
vendor=hisilicon
verify=n

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDAx+2lPdUsD8uWr1xp/imR4RJyX2Uy9sZ1ladEIbD1kYrXHz/7VciYlbQ01f/h1BcWmwjNTM2

mount /dev/mmcblk0p1 /mnt/sd

mw.b 82000000 ff C00000
tftp 0x82000000 kernel.bin
nand erase 100000 400000
nand write 82000000 100000 400000

mw.b 82000000 ff C00000
tftp 0x82000000 rootfs.bin
nand erase 500000 7800000
nand write 82000000 500000 7800000

arch=arm
baudrate=115200
board=hi3516cv500
board_name=hi3516cv500
bootargs=bootargs=mem=256M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 rw mtdparts=hinand:1M(boot),4M(kernel),120M(rootfs)
bootcmd=nand read 0x82000000 0x100000 0x400000;bootm 0x82000000
bootdelay=2
cpu=armv7
ethact=eth0
ethaddr=06:4c:3f:a4:af:c6
fileaddr=82000000
filesize=400000
gatewayip=192.168.0.1
ipaddr=192.168.0.12
nand_erasesize=20000
nand_oobsize=40
nand_writesize=800
netmask=255.255.255.0
serverip=192.168.0.2
soc=hi3516cv500
stderr=serial
stdin=serial
stdout=serial
vendor=hisilicon
verify=n

wget http://192.168.0.2/File/C:/Users/tom/Desktop/CV500/mtd/kernel.bin -O- | dd of=/dev/mtd1

海思 sdk 使用
https://www.pianshen.com/article/47701205657/
解决了 gzip-1.8问题
https://blog.csdn.net/wb4916/article/details/114887107

解决 ‘major’ 报错
ihttps://www.ebaina.com/articles/140000004458
1.osdrv 顶层 Makefile 使用说明
本目录下的编译脚本支持 arm-himix200-linux,arm-himix200-linux工具链对应glibc库。具体命令如下(以hi3516dv300举例)

(1)编译整个osdrv目录:

注意:默认不发布内核源码包,只发布补丁文件。内核源码包需自行从开源社区上下载。
      从linux开源社区下载v4.9.37版本的内核:
     1)进入网站:www.kernel.org
     2)选择HTTP协议资源的https://www.kernel.org/pub/选项,进入子页面
     3)选择linux/菜单项,进入子页面
     4)选择kernel/菜单项,进入子页面
     5)选择v4.x/菜单项,进入子页面
     6)下载linux-4.9.37.tar.gz (或者linux-4.9.37.tar.xz)到osdrv/opensource/kernel目录下     

make all

注意:由于Makefile中文件系统编译依赖组件较多,不能保证单独编译的文件系统可用,建议采用make all编译;

    但可单独编译uboot,kernel;

可以传如下参数:
a, BOOT_MEDIA:spi(default) or emmc
b, CHIP:hi3516dv300(default) 、 hi3516av300 or hi3516cv500
c, 如果客户想要更换可以使用TARGET_XLSM=*.xlsm来指定所需要的u-boot表格文件

(2)清除整个osdrv目录的编译文件:

make OSDRV_CROSS=arm-himix200-linux clean

(3)彻底清除整个osdrv目录的编译文件,除清除编译文件外,还删除已编译好的镜像:

make OSDRV_CROSS=arm-himix200-linux distclean

(4)单独编译kernel(以hi3516dv300举例):

注意:单独编译内核之前请先阅读osdrv/opensource/kernel下的readme_cn.txt说明。

待进入内核源代码目录后,执行以下操作
cp arch/arm/configs/hi3516dv300_smp_defconfig  .config
(emmc启动时执行如下操作:cp arch/arm/configs/hi3516dv300_emmc_smp_defconfig  .config)

make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage

(5)单独编译模块(以hi3516dv300举例):

待进入内核源代码目录后,执行以下操作
cp arch/arm/configs/hi3516dv300_smp_defconfig  .config
(emmc启动时执行如下操作:cp arch/arm/configs/hi3516dv300_emmc_smp_defconfig  .config)
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- modules

(6)单独编译uboot(以hi3516dv300举例):
(注意:发布包默认按照DMEB板的配置发布,如果客户单板和DEMB板不一致,需要根据客户自己的单板环境修改uboot表格才能使用,否则可能导致uboot无法启动或者其他问题。)

待进入boot源代码目录后,执行以下操作
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3516dv300_defconfig
(emmc启动时执行如下操作:make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3516dv300_emmc_defconfig)

make ARCH=arm CROSS_COMPILE=arm-himix200-linux- -j 20

make -C ../../../tools/pc/hi_gzip

cp ../../../tools/pc/hi_gzip/bin/gzip arch/arm/cpu/armv7/hi3516dv300/hw_compressed/ -rf 

Windowns下进入到osdrv/tools/pc/uboot_tools/目录下打开对应单板的Excel文件,在main标签中点击"Generate reg bin file"按钮,生成reg_info.bin即为对应平台的表格文件。
从osdrv/tools/pc/uboot_tools目录拷贝reg_info.bin到boot源代码目录,重命名为.reg
cp ../../../tools/pc/uboot_tools/reg_info.bin .reg

make ARCH=arm CROSS_COMPILE=arm-himix200-linux- u-boot-z.bin

opensource/uboot/u-boot-2016.11下生成的u-boot-hi3516dv300.bin即为可用的u-boot镜像

(7)制作文件系统镜像:
在osdrv/pub/中有已经编译好的文件系统,因此无需再重复编译文件系统,只需要根据单板上flash的规格型号制作文件系统镜像即可。

SPI NOR Flash使用jffs2格式的镜像,制作jffs2镜像时,需要用到SPI NOR Flash的块大小。这些信息会在uboot启动时
会打印出来。建议使用时先直接运行mkfs.jffs2工具,根据打印信息填写相关参数。
下面以块大小为64KB为例:
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x10000 -o osdrv/pub/rootfs_uclibc_64k.jffs2
或者
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_glibc -l -e 0x10000 -o osdrv/pub/rootfs_glibc_64k.jffs2

    Nand Flash使用yaffs2格式的镜像,制作yaffs2镜像时,需要用到nand flash的pagesize和ecc。这些信息会在uboot启动时会打
印出来。建议使用时先直接运行mkyaffs2image工具,根据打印信息填写相关参数。
下面以并口NAND的2KB pagesize、4bit ecc为例:
    osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_4bit.yaffs2 1 2
    或者
    osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_glibc osdrv/pub/rootfs_glibc_2k_4bit.yaffs2 1 2

    Nand Flash使用UBI文件系统,在osdrv/tools/pc/ubi_sh下提供mkubiimg.sh工具用于制作UBI文件系统,需要用到Nand
Flash的pagesize、blocksize和UBIFS分区的大小。
以2KB pagesize, 128KB blocksize和UBI文件系统分区大小32MB为例:

mkubiimg.sh hi3516dv300 2k 128k osdrv/pub/rootfs 32M osdrv/pub/bin/pc

osdrv/pub/rootfs是根文件系统文件夹目录
osdrv/pub/bin/pc是制作UBI文件系统镜像的工具目录
    生成的rootfs_hi3516dv300_2k_128k_32M.ubifs,就是最终用于烧写的UBI文件系统镜像。
  1. 镜像存放目录说明
    编译完的image,rootfs等存放在osdrv/pub目录下
    pub
    ├─ bin
    │   ├─ board_glibc -------------------------------------------- himix200编译出的单板用工具
    │   │   ├── ethtool
    │   │   ├── flashcp
    │   │   ├── flash_erase
    │   │   ├── flash_otp_dump
    │   │   ├── flash_otp_info
    │   │   ├── gdb-arm-himix200-linux
    │   │   ├── mtd_debug
    │   │   ├── mtdinfo
    │   │   ├── nanddump
    │   │   ├── nandtest
    │   │   ├── nandwrite
    │   │   ├── sumtool
    │   │   ├── ubiattach
    │   │   ├── ubicrc32
    │   │   ├── ubidetach
    │   │   ├── ubiformat
    │   │   ├── ubimkvol
    │   │   ├── ubinfo
    │   │   ├── ubinize
    │   │   ├── ubirename
    │   │   ├── ubirmvol
    │   │   ├── ubirsvol
    │   │   └── ubiupdatevol
    │   └─ pc
    │   ├── lzma
    │   ├── mkfs.cramfs
    │   ├── mkfs.jffs2
    │   ├── mkfs.ubifs
    │   ├── mkimage
    │   ├── mksquashfs
    │   └── ubinize
    ├─image_glibc ------------------------------------------------- himix200编译出的镜像文件
    │ ├── uImage_hi3516dv300 ----------------------------------------- kernel镜像
    │ ├── u-boot-hi3516dv300.bin ------------------------------------- u-boot镜像
    │ ├── rootfs_hi3516dv300_64k.jffs2 ------------------------------- 64K jffs2 文件系统镜像
    │ ├── rootfs_hi3516dv300_128k.jffs2 ------------------------------ 128K jffs2 文件系统镜像
    │ ├── rootfs_hi3516dv300_256k.jffs2 ------------------------------ 256K jffs2 文件系统镜像
    │ ├── rootfs_hi3516dv300_2k_4bit.yaffs2 -------------------------- yaffs2 文件系统镜像
    │ ├── rootfs_hi3516dv300_2k_24bit.yaffs2 ------------------------- yaffs2 文件系统镜像
    │ ├── rootfs_hi3516dv300_4k_4bit.yaffs2 -------------------------- yaffs2 文件系统镜像
    │ ├── rootfs_hi3516dv300_4k_24bit.yaffs2 ------------------------- yaffs2 文件系统镜像
    │   ├── rootfs_hi3516dv300_2k_128k_32M.ubifs------------------------ 2k 128k UBI 文件系统镜像
    │   └── rootfs_hi3516dv300_4k_256k_50M.ubifs------------------------ 4k 256k UBI 文件系统镜像

    ├─ rootfs.ubiimg ----------------------------------------------- UBIFS根文件系统
    ├─ rootfs_glibc.tgz ------------------------------------------- himix200编译出的rootfs文件系统

3.osdrv目录结构说明:
osdrv
├─Makefile ------------------------------ osdrv目录编译脚本
├─tools --------------------------------- 存放各种工具的目录
│ ├─board ------------------------------ 各种单板上使用工具
│ │ ├─ethtools ----------------------- ethtools工具
│ │ ├─reg-tools-1.0.0 ----------------- 寄存器读写工具
│ │ ├─udev-167 ------------------------ udev工具集
│ │ ├─mtd-utils ----------------------- flash裸读写工具集
│ │ ├─gdb ----------------------------- gdb工具
│ │ └─e2fsprogs ----------------------- mkfs工具集
│ └─pc ---------------------------------- 各种pc上使用工具
│ ├─jffs2_tool----------------------- jffs2文件系统制作工具
│ ├─cramfs_tool --------------------- cramfs文件系统制作工具
│ ├─squashfs4.3 --------------------- squashfs文件系统制作工具
│ ├─nand_production ----------------- nand量产工具
│ ├─lzma_tool ----------------------- lzma压缩工具
│ ├─zlib ---------------------------- zlib工具
│ ├─mkyaffs2image -- ---------------- yaffs2文件系统制作工具
│ └─uboot_tools ----------------------uboot镜像制作工具、xls文件及ddr初始化脚本、reg_info.bin制作工具
├─pub ----------------------------------- 存放各种镜像的目录
│ ├─image_glibc ------------------------ 基于himix200工具链编译,可供FLASH烧写的映像文件,包括uboot、内核、文件系统
│ ├─bin -------------------------------- 各种未放入根文件系统的工具
│ │ ├─pc ------------------------------ 在pc上执行的工具
│ │ ├─board_glibc --------------------- 基于himix200工具链编译,在单板上执行的工具
│ └─rootfs_glibc.tgz ------------------- 基于himix200工具链编译的根文件系统
├─opensource----------------------------- 存放各种开源源码目录
│ ├─busybox ---------------------------- 存放busybox源代码的目录
│ ├─uboot ------------------------------ 存放uboot及安全boot源代码的目录
│ └─kernel ----------------------------- 存放kernel源代码的目录
└─rootfs_scripts ------------------------- 存放根文件系统制作脚本的目录

4.注意事项
(1)在windows下复制源码包时,linux下的可执行文件可能变为非可执行文件,导致无法编译使用;u-boot或内核下编译后,会有很多符号链接文件,在windows下复制这些源码包, 会使源码包变的巨大,因为linux下的符号链接文件变为windows下实实在在的文件,因此源码包膨胀。因此使用时请注意不要在windows下复制源代码包。
(2)使用某一工具链编译后,如果需要更换工具链,请先将原工具链编译文件清除,然后再更换工具链编译。
(3)编译板端软件

a.此芯片具有浮点运算单元和neon。文件系统中的库是采用软浮点和neon编译而成,因此请用户注意,所有此芯片板端代码编译时需要在Makefile里面添加选项-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4。

如:
对于A7:

CFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -fno-aggressive-loop-optimizations
CXXFlAGS +=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -fno-aggressive-loop-optimizations

其中CXXFlAGS中的XX根据用户Makefile中所使用宏的具体名称来确定,e.g:CPPFLAGS。

VR

微信图片_20210907162613.jpg