Linux学习笔记5---WSL2编译裸机程序并烧录至SD卡
在用WLS进行开发的时候发现在mnt/底下竟然识别不了U盘!!也识别不了SD卡!!那程序不就不能烧录到SD卡上了???那还开发个锤子。
在网上查找了一些相关资料,发现可以通过Win32DiskImager在Windows系统下烧录SD卡。将软件安装到电脑上。
Win32DiskImager下载链接:Win32 Disk Imager download | SourceForge.net
正点原子的imxdownload由于包含了烧录的功能,但在WLS上无法识别SD卡,因此无法使用,所以可以将imxdownload的烧录功能都取消,让程序生成一个可烧录的镜像文件即可。
imxdownload.c(正点原子官方.c文件中修改)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "imxdownload.h"#define SHELLCMD_LEN (200)
#define BIN_OFFSET (3072)
#define SD_BIN_OFFSET (1024)
#define BIN_OFFSET2 (BIN_OFFSET+SD_BIN_OFFSET)/* 此宏指明是否打印u-boot.imx的IVT DCD表信息,不同的开发板其IVT和DCD* 表的数据是不同的,因此需要获取所使用的开发板的IVT和DCD表信息,最* 简单的方法就是读取开发板配套资料里面的u-boot.imx的前1KB数据,理论上* 应该读取3KB的数据,但是表信息远远没有3K这么多,因此读1KB即可 */
#define PRINT_TAB 0
/** 介绍: 此软件是针对NXP的IMX6U系列芯片的,软件用来烧写bin文件到SD卡里面,* 本软件会自动添加IVT、DCD等信息到原始的bin文件里面,主要用于裸机和uboot的烧写。* 使用方法: 1、编译好原始的二进制bin文件,如,u-boot.bin等,并将编译好的.bin文件和本* 软件放置到同一个目录下!!!!* 2、执行命令sudo ./imxdownload <soucre_bin> <sd_device>* 如烧写u-boot.bin到/dev/sdd中即可使用如下所示命令:* sudo ./imxdownload u-boot.bin /dev/sdd*//** 输出一些信息*/
void message_print(void)
{ printf("I.MX6ULL bin merge software\r\n");printf("Edit by:trueLink\r\n");printf("Date:2022/11/26\r\n");printf("Version:V1.0\r\n");printf("log:V1.0 initial version,support 256MB、512MB DDR3\r\n");
}int main(int argc, char *argv[])
{FILE *fp;unsigned char *buf,*buf2;unsigned char *cmdbuf;int nbytes, filelen;int i = 0, j = 0;int ddrsize = 0; /* 0为512MB,1为256MB,2为128MB...... */message_print();if((argc != 2) && (argc != 3)){printf("Error Usage! Reference Below:\r\n");printf("sudo ./%s <-512m or -256m> <source_bin> \r\n", argv[0]);return -1;}/* 查找参数,获取DDR容量 */for(i = 0; i < argc; i++){char *param = argv[i];if(param[0] != '-')continue;if(strcmp(param, "-256m") == 0) /* 256MB */ddrsize = 1;else if(strcmp(param, "-512m") == 0) /* 512MB */ddrsize = 0;}if(argc == 2) /* 三个参数,也就是不输入DDR容量的话默认为512MB */ddrsize = 0;/* 打开bin文件 */fp = fopen(argv[1], "rb"); /* 以二进制只读方式打开bin文件 */if(fp == NULL){printf("Can't Open file %s\r\n", argv[1]);return -1;}/* 获取bin文件长度 */fseek(fp, 0L, SEEK_END);filelen = ftell(fp);fseek(fp, 0L, SEEK_SET);printf("file %s size = %dBytes\r\n", argv[1], filelen);/* 读取bin文件到缓冲区buf中 */buf = malloc(filelen + BIN_OFFSET);if(buf == NULL){printf("Mem Malloc Failed!\r\n");free(buf);fclose(fp);return -1;}memset(buf, 0, filelen + BIN_OFFSET); /* 清零 *//* 读取bin源码文件 */fread(buf + BIN_OFFSET, 1, filelen, fp);/* 关闭文件 *///fclose(fp); //buf2//buf2///buf2 = malloc(filelen + BIN_OFFSET2);if(buf2 == NULL){printf("Mem Malloc Failed!\r\n");free(buf2);fclose(fp);return -1;}memset(buf2, 0, filelen + BIN_OFFSET2); /* 清零 *//* 复制bin源码文件 */memcpy(buf2 + BIN_OFFSET2, buf + BIN_OFFSET, filelen);/* 关闭文件 */fclose(fp);#if PRINT_TABprintf("IVT DCD Table:\r\n");for(i = 0; i < 1024/32; i++){for(j = 0; j < 8; j++){printf("0X%08X,",*(int *)(buf + BIN_OFFSET + (((i * 8) + j) * 4)));}printf("\r\n");} free(buf);return 0;
#endif/* 添加IVT DCD等表信息到bin文件里面 */if(ddrsize == 0) { /* 512MB */printf("Board DDR SIZE: 512MB\r\n");memcpy(buf, imx6_512mb_ivtdcd_table, sizeof(imx6_512mb_ivtdcd_table));}else if (ddrsize == 1) { /* 256MB */printf("Board DDR SIZE: 256MB\r\n");memcpy(buf, imx6_256mb_ivtdcd_table, sizeof(imx6_256mb_ivtdcd_table));}/* 现在我们已经在buf中构建好了可以用于下载的bin文件,将buf中的数据保存到* 到一个文件中,文件命名为load.imx*/printf("Delete Old load.imx\r\n");system("rm -rf load.imx"); /* 先删除旧的load.imx文件 */printf("Create New load.imx\r\n");system("touch load.imx"); /* 创建新的load.imx文件 */fp = fopen("load.imx", "wb"); /* 打开laod.imx */if(fp == NULL){printf("Cant't Open load.imx!!!\r\n");free(buf);fclose(fp);return -1;}nbytes = fwrite(buf, 1, filelen + BIN_OFFSET, fp);if(nbytes != (filelen + BIN_OFFSET)){printf("File Write Error!\r\n");free(buf);fclose(fp);return -1;}printf("load.imx is complete.\r\n");free(buf);fclose(fp); //buf2////* 添加IVT DCD等表信息到bin文件里面 */if(ddrsize == 0) { /* 512MB */printf("Board DDR SIZE: 512MB\r\n");memcpy(buf2+SD_BIN_OFFSET, imx6_512mb_ivtdcd_table, sizeof(imx6_512mb_ivtdcd_table));}else if (ddrsize == 1) { /* 256MB */printf("Board DDR SIZE: 256MB\r\n");memcpy(buf2+SD_BIN_OFFSET, imx6_256mb_ivtdcd_table, sizeof(imx6_256mb_ivtdcd_table));}//新建一个可直接烧录到SD的bin文件 load.binprintf("Delete Old load.img\r\n");system("rm -rf load.img"); /* 先删除旧的load.img */printf("Create New load.img\r\n");system("touch load.img"); /* 创建新的load.img */fp = fopen("load.img", "wb"); /* 打开laod.img */if(fp == NULL){printf("Cant't Open load.img!!!\r\n");free(buf2);fclose(fp);return -1;}nbytes = fwrite(buf2, 1, filelen + BIN_OFFSET2, fp);if(nbytes != (filelen + BIN_OFFSET2)){printf("File Write Error!\r\n");free(buf2);fclose(fp);return -1;}printf("load.bin is complete.\r\n");free(buf2);fclose(fp); //屏蔽烧录命令/* 构建烧写的shell命令 */// cmdbuf = malloc(SHELLCMD_LEN);// sprintf(cmdbuf, "sudo dd iflag=dsync oflag=dsync if=load.imx of=%s bs=512 seek=2",argv[2]); // printf("Download load.imx to %s ......\r\n", argv[2]);// /* 执行上面的shell命令 */// system(cmdbuf);// free(cmdbuf);return 0;
}
imxdownload.h (未修改正点原子官方.h文件)
#ifndef _IMXDOWNLOAD_H
#define _IMXDOWNLOAD_H
/* IMX6U IVT DCD表信息 暂时定义为1K Bytes,此表是读取的u-boot.imx前1K Bytes* imx6_ivedcd_table[9]是指明代码长度的,本应该根据实际的代码长度来修改* 这里为了方便,就直接定义为2M Bytes,即*/const int imx6_512mb_ivtdcd_table[256] = {
0X402000D1,0X87800000,0X00000000,0X877FF42C,0X877FF420,0X877FF400,0X00000000,0X00000000,
0X877FF000,0X00200000,0X00000000,0X40E801D2,0X04E401CC,0X68400C02,0XFFFFFFFF,0X6C400C02,
0XFFFFFFFF,0X70400C02,0XFFFFFFFF,0X74400C02,0XFFFFFFFF,0X78400C02,0XFFFFFFFF,0X7C400C02,
0XFFFFFFFF,0X80400C02,0XFFFFFFFF,0XB4040E02,0X00000C00,0XAC040E02,0X00000000,0X7C020E02,
0X30000000,0X50020E02,0X30000000,0X4C020E02,0X30000000,0X90040E02,0X30000000,0X88020E02,
0X30000C00,0X70020E02,0X00000000,0X60020E02,0X30000000,0X64020E02,0X30000000,0XA0040E02,
0X30000000,0X94040E02,0X00000200,0X80020E02,0X30000000,0X84020E02,0X30000000,0XB0040E02,
0X00000200,0X98040E02,0X30000000,0XA4040E02,0X30000000,0X44020E02,0X30000000,0X48020E02,
0X30000000,0X1C001B02,0X00800000,0X00081B02,0X030039A1,0X0C081B02,0X0B000300,0X3C081B02,
0X44014801,0X48081B02,0X302C4040,0X50081B02,0X343E4040,0X1C081B02,0X33333333,0X20081B02,
0X33333333,0X2C081B02,0X333333F3,0X30081B02,0X333333F3,0XC0081B02,0X09409400,0XB8081B02,
0X00080000,0X04001B02,0X2D000200,0X08001B02,0X3030331B,0X0C001B02,0XF3526B67,0X10001B02,
0X630B6DB6,0X14001B02,0XDB00FF01,0X18001B02,0X40172000,0X1C001B02,0X00800000,0X2C001B02,
0XD2260000,0X30001B02,0X23106B00,0X40001B02,0X4F000000,0X00001B02,0X00001884,0X90081B02,
0X00004000,0X1C001B02,0X32800002,0X1C001B02,0X33800000,0X1C001B02,0X31800400,0X1C001B02,
0X30802015,0X1C001B02,0X40800004,0X20001B02,0X00080000,0X18081B02,0X27020000,0X04001B02,
0X2D550200,0X04041B02,0X06100100,0X1C001B02,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000
};const int imx6_256mb_ivtdcd_table[256] = {
0X402000D1,0X87800000,0X00000000,0X877FF42C,0X877FF420,0X877FF400,0X00000000,0X00000000,
0X877FF000,0X00076000,0X00000000,0X40E801D2,0X04E401CC,0X68400C02,0XFFFFFFFF,0X6C400C02,
0XFFFFFFFF,0X70400C02,0XFFFFFFFF,0X74400C02,0XFFFFFFFF,0X78400C02,0XFFFFFFFF,0X7C400C02,
0XFFFFFFFF,0X80400C02,0XFFFFFFFF,0XB4040E02,0X00000C00,0XAC040E02,0X00000000,0X7C020E02,
0X30000000,0X50020E02,0X30000000,0X4C020E02,0X30000000,0X90040E02,0X30000000,0X88020E02,
0X30000C00,0X70020E02,0X00000000,0X60020E02,0X30000000,0X64020E02,0X30000000,0XA0040E02,
0X30000000,0X94040E02,0X00000200,0X80020E02,0X30000000,0X84020E02,0X30000000,0XB0040E02,
0X00000200,0X98040E02,0X30000000,0XA4040E02,0X30000000,0X44020E02,0X30000000,0X48020E02,
0X30000000,0X1C001B02,0X00800000,0X00081B02,0X030039A1,0X0C081B02,0X04000000,0X3C081B02,
0X3C013C01,0X48081B02,0X38324040,0X50081B02,0X28304040,0X1C081B02,0X33333333,0X20081B02,
0X33333333,0X2C081B02,0X333333F3,0X30081B02,0X333333F3,0XC0081B02,0X09409400,0XB8081B02,
0X00080000,0X04001B02,0X2D000200,0X08001B02,0X3030331B,0X0C001B02,0XF352433F,0X10001B02,
0X630B6DB6,0X14001B02,0XDB00FF01,0X18001B02,0X40172000,0X1C001B02,0X00800000,0X2C001B02,
0XD2260000,0X30001B02,0X23104300,0X40001B02,0X47000000,0X00001B02,0X00001883,0X90081B02,
0X00004000,0X1C001B02,0X32800002,0X1C001B02,0X33800000,0X1C001B02,0X31800400,0X1C001B02,
0X30802015,0X1C001B02,0X40800004,0X20001B02,0X00080000,0X18081B02,0X27020000,0X04001B02,
0X2D550200,0X04041B02,0X06100100,0X1C001B02,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
};#endif
1、修改程序后再WLS上编译出新的imxdownload执行文件,
gcc imxdownload.c -o imxdownload2
修改后的文件可在此处下载: 【免费】imxdownload修改文件资源-CSDN文库
2、 把imxdownload2复制到需要烧录的工程下
执行:
./imxdownload2 led.bin
注:led.bin是工程中需要的.bin文件
此时,生成了.imx (可在Linux下用dd命令烧录), img (可在windows下用Win32DiskImager烧录SD卡)。load.img的内容是在load.imx基础上偏移了1K 字节,这样可以直接烧录到SD卡。
3、Win32DiskImager烧录SD卡
使用Win32DiskImager打开需要烧录的.imx文件进行,点击“写入”即可。
写入成功后将SD卡插回开发板上,选择SD卡启动,程序成功运行。
上述方法简单好用对新手友好,但多了一步烧录的步骤,如果觉得繁琐可以参考
解决WSL烧录SD卡问题_wsl如何连接sd卡-CSDN博客文章,可以利用命令在WLS上直接调用Windows上的软件进行烧录。
如果想在WLS上识别到SD卡,可参考下面文章进行设置。
WSL2连接USB存储设备(保姆级教程,真正做到你奶奶来了也能成功)_wsl2 usb-CSDN博客
参考文献:
WSL2编译IMX6ULL裸机程序烧录至SD卡_wsl u盘 /dev/sd-CSDN博客