wince7 自动烧录emmc系统测试rtc,net,emmc

本文详细介绍了EMMC更新工具的设计与实现,包括对话框界面、设备检测、注册表读取及线程处理等功能。通过创建并运行外部进程,实现EMMC分区与更新,同时展示了如何使用Windows API进行文件操作与系统调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// AutoUpdateEmmcNKDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "AutoUpdateEmmcNK.h"
#include "AutoUpdateEmmcNKDlg.h"
#include <ShellAPI.h>
//#include <shlwapi.h>
//#pragma comment(lib,"Shlwapi.lib") //如果没有这行,会出现li
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAutoUpdateEmmcNKDlg 对话框

CAutoUpdateEmmcNKDlg::CAutoUpdateEmmcNKDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CAutoUpdateEmmcNKDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CAutoUpdateEmmcNKDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

#define NETWORK_CARD_DEVICE_NAME                      _T("CPSW3G2")//网卡设备的名称
#define NETWORK_CARD_REGISTER_PARAM_PATH              _T("Comm\\CPSW3G2\\Parms\\TcpIp")
#define NETWORK_CARD_REGISTER_IPADDRESS_PARAM         _T("DhcpIPAddress")
BEGIN_MESSAGE_MAP(CAutoUpdateEmmcNKDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
    ON_WM_SIZE()
#endif
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

int ReadRegPath(LPCTSTR subKeyName,LPCTSTR valueName,WCHAR * buf)//
{
    HKEY hk;
    DWORD dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKeyName, 0, 0, &hk);
    DWORD dwType=REG_SZ;
    DWORD dwSize=200;

    if(dwStatus == ERROR_SUCCESS && dwType == REG_SZ) 
    {        
        dwStatus = RegQueryValueEx(hk, valueName, NULL, &dwType, (LPBYTE)buf, &dwSize);
        //printf(">>>>>>>>>>>>>>>>>>>>dwSize:%d\n",dwSize);
        if(dwStatus != ERROR_SUCCESS) 
        {
            return -1;
        }
    }
    else
    {
        return -1;
    }

    if(hk != NULL)
    {
        RegCloseKey(hk);
    }
    return dwSize;
}
static DWORD UserWirelessLanProcessThread(LPVOID pParam)
{    
    CAutoUpdateEmmcNKDlg *dlg=(CAutoUpdateEmmcNKDlg*) pParam;//new CuserkeyDlg;// 
    TCHAR   strTime[20]; 

    WCHAR outBuf[200]={0};
    CString str;
    int ret;
    while(1)
    {
    //CString strFile = _T("E:\\1.bat");ShellExecute(NULL, _T("open"), strFile, _T(""), NULL, SW_HIDE);
        FILE *fp = fopen("\\BOOT\\MLO", "rb+");
        if (fp)
        {
            fclose(fp);
            dlg->SetDlgItemTextW(IDC_EMMC,_T("EMMC 检测成功!"));
        }
        else 
        {
            dlg->SetDlgItemTextW(IDC_EMMC,_T("EMMC 检测失败!"));
        }
        ret=ReadRegPath(NETWORK_CARD_REGISTER_PARAM_PATH,NETWORK_CARD_REGISTER_IPADDRESS_PARAM,outBuf);

        CString StrIP=CString(outBuf);
        //if(ret>=0)
        dlg->SetDlgItemTextW(IDC_NET,StrIP);
        //str.Format(_T("%d"),ret);
        //dlg->SetDlgItemTextW(IDC_TEXTOUT,str);
    
        CTime time = CTime::GetCurrentTime();

        swprintf(strTime,_T("%04d-%02d-%02d %02d:%02d:%02d"),time.GetYear(),time.GetMonth(),time.GetDay(),

        time.GetHour(),time.GetMinute(),time.GetSecond()); 

        CString m_strtime = (CString)strTime;
        Sleep(1000);
        dlg->SetDlgItemTextW(IDC_RTC,m_strtime);
    }

}
// CAutoUpdateEmmcNKDlg 消息处理程序

BOOL CAutoUpdateEmmcNKDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    // 执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标
    char cmd[256] = "\0";
    char szCmdLine[1024]="www.baidu.com";
   // sprintf(cmd,"%s %s","/c ping",szCmdLine);
    sprintf(cmd,"%s ","/c \\windows\\prepemmc.bat");
    BOOL m=CopyFile(TEXT("MLO"),TEXT("\\boot"),FALSE);
    TCHAR execmd[256] = _T("\0");
    mbstowcs(execmd,cmd,strlen(cmd));
    // TODO: 在此添加额外的初始化代码
    HANDLE commandThread;
    commandThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UserWirelessLanProcessThread,  this,  0, &threadID);PROCESS_INFORMATION ProInfo;    //进程信息结构
 
    STARTUPINFO    StartInfo;
    ZeroMemory ( &StartInfo,sizeof(StartInfo));
    StartInfo.wShowWindow=SW_SHOWNORMAL;
    ZeroMemory (&ProInfo,sizeof(ProInfo));
    //CreateProcess(NULL,TEXT("\\windows\\diskpartemmc -s \\windows\\partemmc.txt"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    //CreateProcess(TEXT("\\windows\\diskpartemmc.exe"),TEXT(" -s \\windows\\partemmc.txt"),NULL,NULL,NULL,NULL,NULL,NULL,&StartInfo,&ProInfo);                    // 进程信息结构
    //SetStdioPathW(1, TEXT("\\PocketMory1\\tempout.txt"));
    CreateProcess(TEXT("\\windows\\cmd.exe"),execmd,NULL,NULL,NULL,NULL,NULL,NULL,&StartInfo,&ProInfo);                    // 进程信息结构
    WaitForSingleObject(ProInfo.hProcess, INFINITE);
                     
    CloseHandle ( ProInfo.hProcess );
    CloseHandle ( ProInfo.hThread );
/*    BOOL m=CopyFile(TEXT("\\Storage Card\\MLO"),TEXT("\\boot\\MLO"),FALSE);
    m=CopyFile(TEXT("\\Storage Card\\ebootsd.nb0"),TEXT("\\boot"),FALSE);
    m=CopyFile(TEXT("\\Storage Card\\logo.bin"),TEXT("\\boot"),FALSE);
    m=CopyFile(TEXT("\\Storage Card\\nk.bin"),TEXT("\\boot"),FALSE);
    system(TEXT(""));
*/
    ZeroMemory ( &StartInfo,sizeof(StartInfo));
    ZeroMemory (&ProInfo,sizeof(ProInfo));
    //CreateProcess(NULL,TEXT("\\windows\\diskpartemmc -s \\windows\\partemmc.txt"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    //    CreateProcess(TEXT("\\windows\\cmd.exe"),TEXT(" cd Storage Card &&copy mlo \boot&&copy ebootsd.nb0 \boot&&copy logo.bin \boot&&copy nk.bin \boot"),NULL,NULL,NULL,NULL,NULL,NULL,&StartInfo,&ProInfo);                    // 进程信息结构
    CreateProcess(NULL,TEXT("prepemmc.bat"),NULL,NULL,NULL,NULL,NULL,NULL,&StartInfo,&ProInfo);                    // 进程信息结构
    WaitForSingleObject(ProInfo.hProcess, INFINITE);
                     
    CloseHandle ( ProInfo.hProcess );
    CloseHandle ( ProInfo.hThread );
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CAutoUpdateEmmcNKDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
    if (AfxIsDRAEnabled())
    {
        DRA::RelayoutDialog(
            AfxGetResourceHandle(), 
            this->m_hWnd, 
            DRA::GetDisplayMode() != DRA::Portrait ? 
            MAKEINTRESOURCE(IDD_AUTOUPDATEEMMCNK_DIALOG_WIDE) : 
            MAKEINTRESOURCE(IDD_AUTOUPDATEEMMCNK_DIALOG));
    }
}
#endif

### 在树莓派上将Ubuntu系统烧录eMMC存储的方法 要将Ubuntu系统烧录到树莓派的eMMC存储中,首先需要准备合适的硬件和软件工具,并按照一定的步骤操作。以下是一个详细的指南。 #### 准备工作 1. **硬件要求**: - 树莓派计算模块(如CM4)。 - 一个USB转TTL串口适配器(用于调试)。 - 一台运行Windows或Linux系统的电脑。 2. **软件要求**: - 下载Ubuntu镜像文件(适用于树莓派的版本,例如Ubuntu Server 21.04)。 - 安装`rpiboot`工具,可以从GitHub获取源码并编译安装[^3]。 - 使用`Win32DiskImager.exe`或其他类似工具进行镜像烧录[^2]。 #### 操作步骤 1. **连接设备**: - 将树莓派计算模块通过适当的接口连接到电脑上。确保连接稳定并且能够识别到设备[^4]。 2. **启动rpiboot**: - 在电脑上运行`rpiboot`工具,这会使得计算模块进入一种特殊模式,允许直接访问其内部eMMC存储。使用命令行执行相关命令以启动服务[^4]。 3. **确认设备识别**: - 运行`lsblk`命令检查设备是否被正确识别。你应该能看到一个新的块设备出现在列表中,这就是计算模块的eMMC存储。 4. **烧录Ubuntu镜像**: - 使用`Win32DiskImager.exe`或者其他支持Linux的工具(如`dd`命令),选择下载好的Ubuntu镜像文件,然后指定目标设备为之前识别出的eMMC设备。 - 确保选择正确的设备路径,以免误操作导致数据丢失。 5. **完成烧录**: - 开始烧录过程,等待直至进度条达到100%。完成后安全弹出设备,断开与电脑的连接。 6. **配置与测试**: - 将计算模块重新插入目标环境,接通电源尝试从eMMC启动Ubuntu系统。 - 如果一切顺利,应该可以看到Ubuntu的启动画面直至登录界面出现。 ### 示例代码:使用dd命令烧录镜像 ```bash # 假设/dev/sdX是你的eMMC设备,请替换为实际设备名称 sudo dd bs=4M if=path/to/ubuntu-image.img of=/dev/sdX status=progress && sync ``` 请注意,在执行上述操作前备份重要数据,避免因操作失误造成的数据损失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值