1、uboot支持SD、优盘启动
安卓刷机固件:
2、下载armbian
armbian地址:https://gitee.com/recologypower/amlogic-s9xxx-armbian.git
1、uboot支持SD、优盘启动
安卓刷机固件:
2、下载armbian
armbian地址:https://gitee.com/recologypower/amlogic-s9xxx-armbian.git
名称:HEU_KMS_Activator
地址:https://github.com/zbezj/HEU_KMS_Activator
/*****************************************************************************
* 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,查询到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 | 程序 |
---|---|
0x80800000 | zImage |
0x83000000 | dtb |
由 IVT + Boot Data + DCD + bin 构成,在DDR中的存放地址如下:
DDR ADDR | 内容 |
---|---|
0x877ff000 | boot load start |
…(+ 1KB, block 0, block 1) | reserve |
0x877ff400 (bolck 2) | IVT(u-boot.imx) |
… | Boot data |
… | DCD |
(+ 3Kb) | ( IVT+BOOTDATA+DCD) |
0x87800000 | bin |
①IVT内容
TAG、指定IVT大小
bin PC指针
DCD地址(ddr)
boot data地址(ddr)
IVT地址(ddr)
②Boot Data内容
xxx.imx起始地址
镜像大小
③DCD内容
TAG、DCD大小、版本
寄存器及值,配置基础功能(时钟、DDR等)
①从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
1、配置BOOT_CFG 为01000000
2、连接串口
3、烧录
1、插入SD卡
2、找到/dev名
3、./imxdownload u-boot.bin /dev/sdd
=> 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)
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
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
arm系统不同于x86服务器,可能是因为外设驱动的问题,无法在启动阶段通过编辑grub进入单用户模式而得以修改root的密码。所以,可如下操作:
1、用其他外置启动盘启动系统,通常是U盘
2、挂载原系统(在eMMC)上的文件系统的 /etc目录
3、vi该目录下的shadow,删除其中root之后两个冒号之间的加密密码
4、保存、退出vi,sync并且shutdown系统
5、拔除外置启动盘,重加电启动原系统
6、此时root已无需密码即可登录,登录后及时passwd修改密码
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修改未生效,可以更改为其他名字。
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。
STM32出现硬件错误可能有以下原因:
在硬件中断函数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,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。