土斯 发布的文章

海思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


红外热成像测试

ir (3).jpg
微信图片_20210718135025.jpg
微信图片_20210718135017.jpg

  # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

"""This example is for Raspberry Pi (Linux) only!
   It will not work on microcontrollers running CircuitPython!"""

import math
from PIL import Image
import board
import adafruit_mlx90640

FILENAME = "mlx.jpg"

MINTEMP = 25.0  # low range of the sensor (deg C)
MAXTEMP = 45.0  # high range of the sensor (deg C)
COLORDEPTH = 1000  # how many color values we can have
INTERPOLATE = 10  # scale factor for final image

mlx = adafruit_mlx90640.MLX90640(board.I2C())

# the list of colors we can choose from
heatmap = (
    (0.0, (0, 0, 0)),
    (0.20, (0, 0, 0.5)),
    (0.40, (0, 0.5, 0)),
    (0.60, (0.5, 0, 0)),
    (0.80, (0.75, 0.75, 0)),
    (0.90, (1.0, 0.75, 0)),
    (1.00, (1.0, 1.0, 1.0)),
)

colormap = [0] * COLORDEPTH

# some utility functions
def constrain(val, min_val, max_val):
    return min(max_val, max(min_val, val))


def map_value(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min


def gaussian(x, a, b, c, d=0):
    return a * math.exp(-((x - b) ** 2) / (2 * c ** 2)) + d


def gradient(x, width, cmap, spread=1):
    width = float(width)
    r = sum(
        [gaussian(x, p[1][0], p[0] * width, width / (spread * len(cmap))) for p in cmap]
    )
    g = sum(
        [gaussian(x, p[1][1], p[0] * width, width / (spread * len(cmap))) for p in cmap]
    )
    b = sum(
        [gaussian(x, p[1][2], p[0] * width, width / (spread * len(cmap))) for p in cmap]
    )
    r = int(constrain(r * 255, 0, 255))
    g = int(constrain(g * 255, 0, 255))
    b = int(constrain(b * 255, 0, 255))
    return r, g, b


for i in range(COLORDEPTH):
    colormap[i] = gradient(i, COLORDEPTH, heatmap)

# get sensor data
frame = [0] * 768
success = False
while not success:
    try:
        mlx.getFrame(frame)
        success = True
    except ValueError:
        continue

# create the image
pixels = [0] * 768
for i, pixel in enumerate(frame):
    coloridx = map_value(pixel, MINTEMP, MAXTEMP, 0, COLORDEPTH - 1)
    coloridx = int(constrain(coloridx, 0, COLORDEPTH - 1))
    pixels[i] = colormap[coloridx]
    print(pixels[i])

# save to file
img = Image.new("RGB", (32, 24))
img.putdata(pixels)
img = img.transpose(Image.FLIP_TOP_BOTTOM)
img = img.resize((32 * INTERPOLATE, 24 * INTERPOLATE), Image.BICUBIC)
img.save("ir.jpg")