#必须有厂家提前烧录的supervivi才能继续操作,否则需要jlink连接jtag烧录

#注意尽量不要用在wsl中用root账号新建文件,会导致权限混乱

推荐使用powershell管理员权限操作usb透传,wsl负责编译烧录,secureCRT操作下载模式,vscode编辑代码(一个屏幕全部搞定)

适用环境: Windows + WSL2 (Ubuntu)

核心目标: 在 Windows 上通过串口控制板子,在 WSL 里编译代码并通过 USB 烧写。

一、 硬件连接与设置 (Physical Setup)

  1. 连接电源线,连接串口线、USBA口 至PC

  1. 将mini2440拨到NOR模式

  2. 安装mini2440驱动:https://www.cnblogs.com/zyly/p/14832238.html#_label

  1. 安装usbipd-win实现usb透传

  2. 插好电源适配器,此时板子电源开关保持关闭

二、 Windows 端环境准备 (一次性配置)

  1. 安装基础工具

  • SecureCRT: 用于串口通信(替代超级终端)。

  • usbipd-win: 用于将 USB 设备穿透给 WSL。

    • 安装命令 (管理员 PowerShell): winget install usbipd-win

  1. 安装驱动

  • 串口驱动 (CH340):

    • Win10/11 通常自动识别。

    • 检查方法: 设备管理器 -> 端口(COM) -> 应显示 USB-SERIAL CH340 (COMx) 且无感叹号。

  • USB 下载驱动 (Zadig 2.9.exe 修复):

    • 板子 S2 拨到 NOR,上电。

    • 下载并运行 Zadig (管理员身份)。

    • Options -> List All Devices。

    • 选择 SEC S3C2410X Test B/D (VID: 5345, PID: 1234)。

    • 驱动选择 libusb-win32,点击 Install/Replace Driver

    • 检查方法: 设备管理器 -> libusb-win32 devices -> 显示 SEC S3C2410X Test B/D 无感叹号。

三、 WSL 端环境准备 (一次性配置)

安装编译依赖

在 WSL 终端执行:

sudo apt install build-essential libusb-dev

编译专用下载工具 (dnw)

这是我们最终调试成功的、带协议头(Header)的版本。请保存为 dnw.c

/* dnw2 linux main file. This depends on libusb.
 *
 * Author: Fox <hulifox008@163.com>
 * License: GPL
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <usb.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define QQ2440_SECBULK_IDVENDOR 0x5345
#define QQ2440_SECBULK_IDPRODUCT 0x1234

struct usb_dev_handle * open_port()
{
    struct usb_bus *busses, *bus;

    usb_init();
    usb_find_busses();
    usb_find_devices();

    busses = usb_get_busses();
    for(bus=busses;bus;bus=bus->next)
    {
         struct usb_device *dev;
        for(dev=bus->devices;dev;dev=dev->next)
        {
            if( QQ2440_SECBULK_IDVENDOR==dev->descriptor.idVendor
            && QQ2440_SECBULK_IDPRODUCT==dev->descriptor.idProduct)
            {
                printf("Target usb device found!\n");
                struct usb_dev_handle *hdev = usb_open(dev);
                if(!hdev)
                {
                    perror("Cannot open device"); 
                }
                else
                {
                    if(0!=usb_claim_interface(hdev, 0))
                    {
                        perror("Cannot claim interface");
                        usb_close(hdev);
                        hdev = NULL;
                    }
                }
                return hdev;
            }
        }
    }
   
    printf("Target usb device not found!\n");

    return NULL;
}

void usage()
{
    printf("Usage: dnw2 <file>\n\n");
}

unsigned char* prepare_write_buf(char *filename, unsigned int *len)
{
    unsigned char *write_buf = NULL;
    struct stat fs;

    int fd = open(filename, O_RDONLY);
    if(-1==fd)
    {
        perror("Cannot open file");
        return NULL;
    }
    if(-1==fstat(fd, &fs))
    {
        perror("Cannot get file size");
        goto error;
    }
    write_buf = (unsigned char*)malloc(fs.st_size+10);
    if(NULL==write_buf)
    {
        perror("malloc failed");
        goto error;
    }

    if(fs.st_size != read(fd, write_buf+8, fs.st_size))
    {
        perror("Reading file failed");
        goto error;
    }

    printf("Filename : %s\n", filename);
    printf("Filesize : %ld bytes\n", (long)fs.st_size);

    *((uint32_t*)write_buf) = 0x30000000; //download address

    *((uint32_t*)write_buf+1) = fs.st_size + 10; //download size;

    *len = fs.st_size + 10;
    close(fd);
    return write_buf;

error:
    if(fd!=-1) close(fd);
    if(NULL!=write_buf) free(write_buf);
    fs.st_size = 0;
    return NULL;
   
}

int main(int argc, char *argv[])
{
    if(2!=argc)
    {
        usage();
        return 1;
    }

    struct usb_dev_handle *hdev = open_port();
    if(!hdev)
    {
        return 1;
    }

    unsigned int len = 0;
    unsigned char* write_buf = prepare_write_buf(argv[1], &len);
    if(NULL==write_buf) return 1;

    unsigned int remain = len;
    unsigned int towrite;
    printf("Writing data ...\n");
    while(remain)
    {
        towrite = remain>512 ? 512 : remain;
        if(towrite != usb_bulk_write(hdev, 0x03, write_buf+(len-remain), towrite, 3000))
        {
            perror("usb_bulk_write failed");
            break;
        }
        remain-=towrite;
        printf("\r%d%%\t %u bytes     ", (len-remain)*100/len, len-remain);
        fflush(stdout);
    }
    if(0==remain) printf("Done!\n");
    return 0;
}

编译命令:

gcc dnw.c -o dnw -lusb

四、 每次烧写代码的标准流程 (SOP)

注意顺序: 必须先让板子进入等待状态,再让 Windows 挂载 USB,最后 WSL 发送。

步骤 1:板子准备 (SecureCRT)

  1. 打开 SecureCRT,新建一个session,选择serial串口模式,必须先设置一次波特率9600,关闭session,再设置115200,连接串口 (COMx, 波特率 115200, Flow Control: None)。

  2. 开启/重启板子电源。

  3. 按键盘 d 键。

    1. 屏幕显示: USB host is connected. Waiting a download.

步骤 2:USB 挂载 (Windows PowerShell 管理员)

查看设备 ID (通常是 3-1 或 2-1):

usbipd list

将设备挂载进 WSL (如果听到叮咚声即成功):

usbipd attach --wsl --busid <你的BUSID>

步骤 3:发送代码 (WSL 终端)

在存放 bin 文件的目录下执行:

sudo ./dnw your_code.bin
  • 成功标志:

  • WSL 显示:>> SUCCESS!

  • secureCRT 显示:Download DoneChecksum OK

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐