OK6410A 开发板 (三) 24 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 fs-fat

  • 相关配置
CONFIG_CMD_FAT=y
  • 相关文件
fs/fat/fat.c
fs/fs_internal.c
fs/fs.c
cmd/fat.c
  • 命令及命令的使用

fatinfo   - print information about filesystem
fatload   - load binary file from a dos filesystem
fatls     - list files in a directory (default /)
fatsize   - determine a file's size


=> fatinfo mmc 0:1 
Interface:  MMC
  Device 0: Vendor: Man 0000fe Snr 00023d01 Rev: 0.0 Prod: SD16G 
            Type: Removable Hard Disk
            Capacity: 30474.0 MB = 29.7 GB (62410752 x 512)
Filesystem: FAT16 "NO NAME 

=> fatload mmc 0:1 0x50008000 uImage
1828792 bytes read in 277 ms (6.3 MiB/s)

=> fatls mmc 0:1                    
  1828792   uImage
1 file(s), 0 dir(s)

=> fatsize mmc 0:1 uImage
// 没有任何打印


命令解析
可以从命令解析的角度了解 fat fs
  • fatinfo
do_fat_fsinfo											cmd/fat.c
	blk_get_device_part_str								disk/part.c 							
	fat_set_blk_dev 									fs/fat/fat.c
	file_fat_detectfs 									fs/fat/fat.c
		printf("\n  Device %d: ", cur_dev->devnum);
		dev_print(cur_dev);								disk/part.c
		read_bootsectandvi(&bs, &volinfo, &fatsize)		fs/fat/fat.c
		memcpy(vol_label, volinfo.volume_label, 11)
		vol_label[11] = '\0';
		volinfo.fs_type[5] = '\0';
		printf("Filesystem: %s \"%s\"\n", volinfo.fs_type, vol_label);
		
  • fatls
do_fat_ls																cmd/fat.c
	do_ls 																fs/fs.c
		fs_set_blk_dev 													fs/fs.c
			blk_get_device_part_str 									disk/part.c
			info->probe/fat_set_blk_dev 								fs/fat/fat.c
		fs_ls 															fs/fs.c
			struct fstype_info *info = fs_get_info(fs_type); 			fs/fs.c
			info->ls(dirname);/fs_ls_generic							fs/fs.c
				fs_opendir												fs/fs.c
					struct fstype_info *info = fs_get_info(fs_type); 	fs/fs.c
					info->opendir(filename, &dirs);/fat_opendir			fs/fat/fat.c
						
					dirs->desc = fs_dev_desc;							fs/fs.c
					dirs->part = fs_dev_part; 							fs/fs.c
				while(dent = fs_readdir(dirs))							fs/fs.c
					switch(dent->type){
					case FS_DT_DIR:
						printf("            %s/\n", dent->name);break;
					case FS_DT_LNK:
						printf("    <SYM>   %s\n", dent->name);break;
					default:
						printf(" %8lld   %s\n", dent->size, dent->name);break;
					}
				fs_closedir 											fs/fs.c
				printf("\n%d file(s), %d dir(s)\n\n", nfiles, ndirs);
				
  • fatload
do_fat_fsload															cmd/fat.c
	do_load 															fs/fs.c
		_fs_read														fs/fs.c
			fs_read_lmb_check											fs/fs.c
			info->read/file_fat_read_at									fs/fat/fat.c
				malloc_cache_aligned									include/memalign.h
				fat_itr_root// 填充itr									fs/fat/fat.c
				fat_itr_resolve											fs/fat/fat.c
				get_contents // 搬运数据									fs/fat/fat.c
					get_cluster											fs/fat/fat.c
						disk_read(startsect, idx, buffer);				fs/fat/fat.c
							blk_dread									drivers/block/blk-uclass.c
						if (size)disk_read(startsect, 1, tmpbuf);
						memcpy(buffer, tmpbuf, size);
		printf("%llu bytes read in %lu ms", len_read, time);
应用
=> fatload mmc 0:1 51000000 2led_c.bin
1049 bytes read in 20 ms (50.8 KiB/s)
=> go 51000000
## Starting application at 0x51000000 ...
// 此时会看到 led灯闪烁
// 一定要主要加载地址和链接地址和运行地址的关系
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值