15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

作者标题

Autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et dolore feugait.

Author Archive by stormwind

【uboot】Uboot烧录及使用

一、UBOOT学习

0、基础知识

进入uboot,查询到dram 起始地址为0x80000000,大小为0x20000000(512Mb)

bdinfo
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x20000000
eth0name    = FEC1
ethaddr     = 88:30:6D:AF:F4:8F
current eth = FEC1
ip_addr     = 192.168.1.3
baudrate    = 115200 bps
TLB addr    = 0x9FFF0000
relocaddr   = 0x9FF55000
reloc off   = 0x18755000
irq_sp      = 0x9EF52EA0
sp start    = 0x9EF52E90
DDR ADDR程序
0x80800000zImage
0x83000000dtb

1、UBOOT裸程序构成

由 IVT + Boot Data + DCD + bin 构成,在DDR中的存放地址如下:

DDR ADDR内容
0x877ff000boot load start
…(+ 1KB, block 0, block 1)reserve
0x877ff400 (bolck 2)IVT(u-boot.imx)
Boot data
DCD
(+ 3Kb)( IVT+BOOTDATA+DCD)
0x87800000bin

①IVT内容

TAG、指定IVT大小
bin PC指针
DCD地址(ddr)
boot data地址(ddr)
IVT地址(ddr)
②Boot Data内容

xxx.imx起始地址
镜像大小
③DCD内容

TAG、DCD大小、版本
寄存器及值,配置基础功能(时钟、DDR等)

2、Uboot烧写方法


①从linux用户空间直接将uboot.imx烧录到SD/EMMC设备

烧录到SD卡

#将SD卡插入开发板或者ubunto开发环境
$ sudo fdisk -l #查看SD卡/dev名
$ sudo dd if=u-boot.imx of=/dev/yourSdName bs=1024 seek=1 conv=fsync

烧录到EMMC

$ echo 0 > /sys/block/mmcblk1boot0/force_ro #开启emmc写功能
$ dd if=u-boot.imx of=/dev/mmcblk1boot0 bs=1024 seek=1 conv=fsync
$ echo 1 >/sys/block/mmcblk1boot0/force_ro #关闭写
$ mmc bootpart enable 1 1 /dev/mmcblk1 #使能分区1

②从uboot中下载后,再写入到SD/EMMC设备block 2处

=> setenv serverip 192.168.1.101
=> tftp 80800000 u-boot.imx
Using FEC1 device
TFTP from server 192.168.1.101; our IP address is 192.168.1.3
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: #########################
	 938.5 KiB/s
done
Bytes transferred = 363520 (58c00 hex)
 => mmc dev 0 0
switch to partitions #0, OK
mmc0 is current device
=> mmc write 80800000 2 2c6 #363520/512

MMC write: dev # 0, block # 2, count 710 ... 710 blocks written: OK 
#emmc需要这一步
=>mmc partconf 1 1 0 0
#重启后,查看版本
=> version  

③ 使用mfgtool通过串口烧录

1、配置BOOT_CFG 为01000000
2、连接串口
3、烧录

④ 在ubuntu开发环境下使用imxdownload

1、插入SD卡
2、找到/dev名
3、./imxdownload u-boot.bin /dev/sdd

3、Uboot下常用命令

=> mmc info #查看当前mmc设备信息
=> mmc list #查看mmc设备列表
=> mmc dev 1 [可选part]#切换到mmc设备1(默认到分区part=0)
=> mmc part #查看当前设备分区
=> mmc read/write/erase 80800000 600 10 #读取0x600块开始10个块到80800000ddr addr.
=> nand info
=> nand device
=> nand erase addr size
=> nand wrete/read addr off size
=> fatinfo mmc 0:1 #产看分区文件系统信息
=> fat[ext2/ext4]ls mmc 0:1 #查看mmc0分区1下文件
=> fat[ext]load mmc 0:1 80800000 file #将文件读取到ddr
=> fdt addr 80800000 #设置设备树地址
=> fdt print #查看设备树文件内容
=> bootz 80800000 - 83000000 #从ddr启动linux镜像zImage(808) 、inidrd(-)、dtb(830)
=> bootm 80800000 #从ddr启动镜像uImage
=> boot #从bootcmd读取,并执行命令
=> reset #重启
=> go addr #跳转到addr并运行bin程序
=> run xxxcmd #运行自定义的xxxcmd(类似于bootcmd)

【Linux】文件系统到处GPIO配置

GPIO号为416具体转换看芯片手册。

echo 416 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio416/direction
echo 1 > /sys/class/gpio/gpio416/value
echo 0 > /sys/class/gpio/gpio416/value

echo in > /sys/class/gpio/gpio416/direction
cat /sys/class/gpio/gpio416/value

echo falling > /sys/class/gpio/gpio416/edge
cat /proc/interrupts |grep gpio

【DTB】设备树解、压包

1、安装工具链

sudo apt-get install device-tree-compiler

2、解包dtb->dts

dtc -I dtb -O dts -o xxx.dts xxx.dtb

3、压包dts->dtb

dtc -I dts -O dtb -o xxx.dtb xxx.dts

【ARMBIAN】系统忘记root密码后如何重置

arm系统不同于x86服务器,可能是因为外设驱动的问题,无法在启动阶段通过编辑grub进入单用户模式而得以修改root的密码。所以,可如下操作:

1、用其他外置启动盘启动系统,通常是U盘

2、挂载原系统(在eMMC)上的文件系统的 /etc目录

3、vi该目录下的shadow,删除其中root之后两个冒号之间的加密密码

4、保存、退出vi,sync并且shutdown系统

5、拔除外置启动盘,重加电启动原系统

6、此时root已无需密码即可登录,登录后及时passwd修改密码

【机顶盒】S905系列芯片无法优盘/TF卡启动

1、找到USB转TTL模块,连接主板TTL排针,具体排针定义请自行百度,或者留言询问。

2、打开xshell软件,连接USB转TTL模块,波特率大多115200,可以多试几个。之后上电,一直按空间。进入boot指令模式。

3、修改环境变量

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'
saveenv

4、手动启动优盘引导或者TF卡引导。

run bootcmd 

5、异常处理

如果bootcmd修改未生效,可以更改为其他名字。

【STM32】硬件错误的调试技巧

在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。

STM32出现硬件错误可能有以下原因:

  1. 数组越界操作;
  2. 内存溢出,访问越界;
  3. 堆栈溢出,程序跑飞;
  4. 中断处理错误;

定位方法一

在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。

1、在Keil菜单栏点击View——Registers Window

在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。

介绍程序R14(LR) = 0xFFFFFFF9实例如下:

2、在Keil菜单栏点击“View”—“Memory Windows”—“Memory1”

在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。

3、在Keil菜单栏点击View——Disassembly Window

在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address…。在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。

定位方法二

1、在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。

2、在Keil菜单栏点击View——Call Stack Window

弹出Call Stack + Locals对话框。然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。

【Linux】安装SCTP协议支持

一、报错现象


sctp程序运行:
int i = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
printf("huilh:%d,%d\r\n",i,errno);
输出:
huilh:-1,93

checksctp:
sctp: Protocol not supported

二、解决方法

1、外围的模块加载到内核中

#yum list kernel-modules-extra*

kernel-modules-extra.x86_64             4.18.0-240.15.1.el8_3             BaseOS

#yum install kernel-modules-extra.x86_64

2、安装SCTP

yum install lksctp*

3、查看安装是否成功

# modinfo sctp

filename:       /lib/modules/4.18.0-240.15.1.el8_3.x86_64/kernel/net/sctp/sctp.ko.xz
license:        GPL
description:    Support for the SCTP protocol (RFC2960)
author:         Linux Kernel SCTP developers <linux-sctp@vger.kernel.org>
alias:          net-pf-10-proto-132
alias:          net-pf-2-proto-132
rhelversion:    8.3
srcversion:     1F7FF36BEF4076DB3D4AF26
depends:        libcrc32c
intree:         Y
name:           sctp
vermagic:       4.18.0-240.15.1.el8_3.x86_64 SMP mod_unload modversions
sig_id:         PKCS#7
signer:         CentOS kernel signing key
sig_key:        43:C1:A4:E8:DF:2E:B3:D4:43:C1:4B:38:46:94:93:EB:C4:27:08:0D
sig_hashalgo:   sha256
signature:      1F:34:2A:3F:35:55:A9:24:B2:64:31:D6:AA:8F:E0:10:0C:76:B8:BF:
        CB:47:B0:59:39:22:B4:E8:3B:9A:F9:B5:82:D9:22:53:4E:A7:27:4C:
        D7:F3:C9:65:B6:77:1A:5A:25:18:C8:9B:D7:27:CB:A3:D4:95:ED:E5:
        3E:87:4E:E3:4F:A0:5B:DA:31:18:34:89:88:D9:CC:F5:90:76:D6:4A:
        0D:BA:1B:09:E2:10:80:7B:77:7B:15:97:7E:F9:45:92:39:7D:7C:A9:
        5D:4E:D5:8C:61:E0:F0:8D:CB:97:A7:E6:0C:84:64:6B:26:C7:69:02:
        54:EA:EB:04:C9:02:39:F8:7E:C7:08:C2:7E:83:4A:69:4F:B2:8C:83:
        C9:51:9B:5D:C7:C4:DB:5A:C4:14:DA:52:64:A2:FF:C5:E2:FE:DA:ED:
        B9:44:4B:C7:A8:D9:F4:78:A6:35:E9:E8:1C:14:E6:1B:1B:AD:72:4B:
        22:4E:05:6D:E6:DE:0A:D8:98:2C:AD:6E:25:84:1F:38:C1:D7:2B:5C:
        79:E6:CC:DF:16:D2:54:17:CD:87:B5:56:00:20:9D:09:F4:01:75:85:
        83:CA:C6:75:7E:3A:15:95:04:98:F1:D4:A1:47:CD:B1:8A:6A:3A:51:
        1F:07:1C:47:02:6A:17:CC:27:F5:DD:58:15:18:77:5B:BC:76:60:3C:
        D5:97:2C:EF:0E:32:E4:A3:93:EE:E7:F8:93:09:CB:1D:DB:84:D3:B5:
        56:C9:50:5C:42:95:7E:64:DF:CD:CE:4E:7E:AF:DE:C8:E9:29:51:62:
        46:C1:6F:BF:85:1E:EB:36:65:40:74:EF:64:47:6A:AB:11:B0:B7:24:
        4E:4F:3A:60:83:C7:5B:42:6A:A3:DC:0B:89:6C:CB:7D:EC:00:6A:8C:
        48:DE:17:B4:85:41:A1:F7:68:74:1C:FA:D2:10:89:20:A7:75:34:05:
        E7:A8:BB:AD:BA:33:2F:04:92:A1:33:1B:68:9A:D7:20:25:BA:7A:61:
        A8:DE:D2:85
parm:           no_checksums:Disable checksums computing and verification (bool)

从上述结果可以看出,可以查到模块,然后使用lsmod | grep sctp查看是否能查到模块,如果不能查到,则使用modprobe sctp 安装

4、手动加载SCTP

# modprobe sctp

安装完毕后,再用lsmod 查看是否已安装sctp模块。所示结果如下。

#lsmod | grep sctp

sctp                  405504  18
libcrc32c              16384  4 nf_conntrack,nf_nat,xfs,sctp

表明lsctp模块已在当前linux下安装完成。或者使用cat 命令。

# cat /proc/modules | grep sctp

sctp 405504 18 - Live 0xffffffffc0d71000
libcrc32c 16384 4 sctp,nf_nat,nf_conntrack,xfs, Live 0xffffffffc00dc000

5、自动加载

如果sctp不能自动加载到内核,请使用下面处理方式。

在/etc/sysconfig/modules的目录下新建sctp.modules文件

#! /bin/sh

/sbin/modinfo -F filename sctp > /dev/null 2>&1
if [ $? -eq 0 ]; then
    /sbin/modprobe sctp
fi

保存后,修改权限chmod+777 sctp.modules,重启便可看到已自动加载。