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

【Linux】linux fdisk tf卡分区操作解析说明

/*****************************************************************************
     *                   linux fdisk tf卡分区操作解析说明
     * 说明:
     *     本文主要是解析linux fdisk命令的使用,是一个朋友留下的自动化脚本。
     *
     *                                       2015-9-16 晴 深圳 南山平山村 曾剑锋
     ****************************************************************************/
    #! /bin/sh
     
    # 卸载接下来需要分区的设备
    umount    /dev/mmcblk1boot0
    umount    /dev/mmcblk1boot1
    umount    /dev/mmcblk1p1
    umount    /dev/mmcblk1p2
    sync                                    # 同步上面的操作
    sleep                                  # 等待1秒
     
    fdisk    /dev/mmcblk1    << EOF          # 开始分区
    d           # 删除操作
               # 删除分区1
    d           # 删除操作
               # 删除分区2,其实只剩下2,这里会出现menu
    m           # 显示操作menu,相当于帮助
    m           # 显示操作menu,相当于帮助
    n           # 创建新分区,相当于new
    p           # 创建primary分区
               # 创建primary分区1
                # First sector (-, default ):
    +50M        # Last sector, +sectors or +size{K,M,G} (-, default ): +50M, Partition  of type Linux and of size  MiB is set
    a           # toggle a bootable flag, 选择启动分区
               # 选择分区1作为启动分区
    t           # change a partition's system id, 改变分区类型
    c           # c  W95 FAT32 (LBA),选择FAT32格式
    n           # 创建新分区,相当于new
    p           # 创建primary分区
               # 创建primary分区2
                # First sector (-, default ):
                # Last sector, +sectors or +size{K,M,G} (-, default ): Using default value , Partition  of type Linux and of size 3.7 GiB is set
    p           # 查看创建结果
    w           # 保存退出
    EOF
    sync                                # 同步以上操作
    sleep 
     
    umount /dev/mmcblk1p1               # 卸载创建的分区
    umount /dev/mmcblk1p2               # 卸载创建的分区
    sync                                # 同步以上操作
    sleep 
     
    mkdosfs  -F  /dev/mmcblk1p1       # 以FAT32格式化mmcblk1p1分区
    sync
    sleep 
     
    mkfs.ext3 /dev/mmcblk1p2            # 以ext3格式化mmcblk1p2分区
    sync
    sleep 
     
    echo "finish make tf card"          # 输出提示信息

【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,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。