admin 发布的文章

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

利用玄学解决液压履带式起重机力矩算法及古法锻造青铜剑

玄学与科学的区别在于科学在乎过程而玄学却可以忽略过程。就拿数据函数y=f(x)做个比方,玄学并不在乎f是什么,他只需要不断的穷举x的值获得y的值从而建立一张表,下次可以直接通过y的值查出x的值,中医和炼丹术皆用此种方法,从神农尝百草就可以片面看出。
履带式起重机的力矩算法相当让人头疼,第一臂长是可伸缩的,也并不是均匀,越往远端越细,关节间也不是耦合紧密 可能存在松动,在吊取物体时臂杆还存在挠性,吊得越重弯的越厉害,第二臂杆在起落的过程与地面形成的夹角也在变化,这个变化单独拿来当做理想情况下算都好算,最终的目的是需要根据臂杆的支撑轴安装的液压传感器的压力值来计算出当前吊重,如果都是在理想情况下都好计算,但实际情况不可能理想,连起重机的使用年限都会影响计算结果,当然 如果这些用科学来计算法也不是无解,只是花的时间和精力会比较大,而且也不是一般学渣能够完成。
针对此种情况,用玄学来解决这个问题似乎是完美的,首先实时采集吊取物体的重量和液压的压力值和臂杆的夹角,并把臂杆慢慢伸缩一遍,抬起放下一遍,吊装物体的重量从小到大从大到小过一遍,并且实时记录这些值经过简单分析入库,正常工作时就可以通过查询当前压力夹角和臂长就可以查询到当前起吊的重量。
几千年前的青铜剑的锻造技术,现在人都不一定能复制出完全一模一样,是现在人技术不行吗,不是的,只是现在人缺乏那种多代人甚至很多个多代人经过无数次的尝试才造出来。
针对三体问题也是一样,宇宙中的两个天体之间的作用力很好计算,下一时刻的姿态也很好计算,当第三个天体加入的时候兴许也能计算,但当第四个五个....参入时,是不是差不多无解了,是不是玄学也也无法解决这个问题呢,当然不是src=http___www.tlang.com_images_store_611703_item_XGC120T.jpg_m.jpg&refer=http___www.tlang.jpg

婴儿睡眠监护器&最小巧的温湿度记录仪

通过监测宝宝包被内温湿度来判断是否冷 热 捂 避免湿疹
主图.jpg
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg

微信图片_20210610101827.jpg

微信图片_20210606183358.jpg

97b07c8617fffdcffdff23d4001f9dc5.mp4
89aadd2250fad9f183ff586d1655d201.mp4