DM365的UBL源码分析(转)

TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇 声明:本文参考网友zjb_integrated的文章《TI Davinci DM6446开发攻略——UBL移植》和《DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植》,内容有增删,特此声明!另有系列网文《DM365的UBL源码分析》(作者不详)对UBL源码的分析比较透彻,有兴趣的也可以看看。 一、DM6441的Boot过程简介 在搭好 TI Da 阅读详情

 

DM365是的启动方式有两种,通过BOOTSEL[2:0]引脚决定。当其为001时,直接从AEMIF上启动,比如NOR和OneNAND。除此之外皆是从RBL启动,顺序为RBL-UBL-UBOOT-KERNEL,比如NAND,串口,SD卡等。RBL会搜寻block1到block24去找UBL,关于RBL启动的详细细节可以参考用户指南关于ARM子系统的那篇文档,很详尽,下面只分析UBL的源码。

     UBL源码在PSP包里的board_utilities/flash_utils目录下,主要是COMMON目录和各子平台的目录如DM36x等,内中除了UBL的源码外还有CCS下JTAG的擦除烧写源码,串口烧写源码等。下面只分析UBL的启动代码。

     入门代码是汇编文件start.S,主要是切换操作模式,建立堆栈等,然后跳转到main函数,进入到board_utilities/flash_utils/Common/ubl/src目录下的C文件ubl.c中。main函数如下:

// Main entry point

void main(void)
{
   
    // Call to real boot function code

    LOCAL_boot();
   
    // Jump to entry point

    DEBUG_printString("/r/nJumping to entry point at ");
    DEBUG_printHexInt(gEntryPoint);
    DEBUG_printString("./r/n");
    APPEntry = (void (*)(void)) gEntryPoint;   
    (*APPEntry)();    
}


        U-boot一般存在于DEVICE_NAND_UBL_SEARCH_START_BLOCK以后块的第0页,ubl试着从DEVICE_NAND_UBL_SEARCH_START_BLOCK块向后搜索每块的第0页,找到后,前24个字节分别记录着u-boot描述,如入口函数等

//DM36x/CCS/NANDWriter/src/nandwriter.c   nandwriter()函数中


// Fill in NandBoot header,rxBuf为刚搜到的页
  gNandBoot.entryPoint = *(((Uint32 *)(&rxBuf[4])));
  gNandBoot.numPage = *(((Uint32 *)(&rxBuf[8])));
  gNandBoot.block = *(((Uint32 *)(&rxBuf[12])));
  gNandBoot.page = *(((Uint32 *)(&rxBuf[16])));
  gNandBoot.ldAddress = *(((Uint32 *)(&rxBuf[20])));

     根据以上信息一次读入每一页,然后将u-boot入口传递给gEntryPoint。


     main函数主要调用了LOCAL_boot函数来进行实质的引导功能,下面是此函数的内容:

static Uint32 LOCAL_boot(void)
{
    DEVICE_BootMode bootMode;
   
    // Read boot mode 从BOOTCFG系统寄存器读出,得到目前BOOTSEL[0..2]

    bootMode = DEVICE_bootMode();
   
    if (bootMode == DEVICE_BOOTMODE_UART)
    {
        // Wait until the RBL is done using the UART.
       //对于通过UART启动的,这些代码应该是存在于uart设备上
       while((UART0->LSR & 0x40) == 0 );
    }
   
    // Platform Initialization

    if ( DEVICE_init() != E_PASS )      
    {
        DEBUG_printString(devString);
        DEBUG_printString(" initialization failed!/r/n");
        asm(" MOV PC, #0");
    }
    else
    {
        DEBUG_printString(devString);
        DEBUG_printString(" initialization passed!/r/n");
    }
   
    // Set RAM pointer to beginning of RAM space

    UTIL_setCurrMemPtr(0);      
   
    // Send some information to host

    DEBUG_printString("TI UBL Version: ");
    DEBUG_printString(UBL_VERSION_STRING);
    DEBUG_printString("/r/nBooting Catalog Boot Loader/r/nBootMode = ");
   
    // Select Boot Mode

#if defined(UBL_NAND)
    {
        //Report Bootmode to host

        DEBUG_printString("NAND/r/n");
       
        // Copy binary image application from NAND to RAM
       //NANDBOOT_copy()首先打开NandFlash设备,将NandFlash的硬件信息放在hNandInfo数据结构内。移植ubl时需要修改与hNandInfo数据结构相关的参数,比如EMIF地址(EMIFStart  = 0x02000000 在ubl.cmd;) DEVICE_NAND_CHIP_infoTable结构中的页大小、块数、块中的页数、...
       if (NANDBOOT_copy() != E_PASS)     
        {
            DEBUG_printString("NAND Boot failed./r/n");
            LOCAL_bootAbort();
        }
    }
#elif defined(UBL_NOR)
    {
       //Report Bootmode to host

        DEBUG_printString("NOR /r/n");
       
        // Copy binary application image from NOR to RAM

        if (NORBOOT_copy() != E_PASS)
        {
            DEBUG_printString("NOR Boot failed./r/n");
            LOCAL_bootAbort();
        }
    }
#elif defined(UBL_SD_MMC)
    {
        //Report Bootmode to host

        DEBUG_printString("SD/MMC /r/n");
       
        // Copy binary of application image from SD/MMC card to RAM

        if (SDMMCBOOT_copy() != E_PASS)
        {
            DEBUG_printString("SD/MMC Boot failed./r/n");
            LOCAL_bootAbort();
        }
    }
#else
    {
        //Report Bootmode to host

        DEBUG_printString("UART/r/n");
        UARTBOOT_copy();
    }
   
   
#endif
   
    DEBUG_printString(" DONE");
   
    UTIL_waitLoop(10000);
   
    DEVICE_TIMER0Stop();   
   
    return E_PASS;
}


     先通过调用DEVICE_bootMode函数来判断启动方式(通过读取SYS寄存器实现),而后调用了DEVICE_init函数来进行平台的最底层初始化,包括电源域,时钟,DDR,EMIF,UART,I2C,TIMER等。

     而后通过UTIL_setCurrMemPtr函数对全局变量currMemPtr赋值,以后用到。接着通过判断不同的引导方式,采取不同的处理办法,以NAND启动为例,将调用NANDBOOT_copy函数。此函数将NAND中的某些内容(就是UBOOT)搬移到RAM中,而后UBL结束,控制权正式交给UBOOT。

看看UBL对平台的初始化,主要是调用了DEVICE_init函数,函数内容如下:

Uint32 DEVICE_init()
{
    Uint32 status = E_PASS;
   
    // Mask all interrupts
    AINTC->INTCTL = 0x4;
    AINTC->EABASE = 0x0;
    AINTC->EINT0 = 0x0;
    AINTC->EINT1 = 0x0;       
   
    // Clear all interrupts
    AINTC->FIQ0 = 0xFFFFFFFF;
    AINTC->FIQ1 = 0xFFFFFFFF;
    AINTC->IRQ0 = 0xFFFFFFFF;
    AINTC->IRQ1 = 0xFFFFFFFF;
   
#ifndef SKIP_LOW_LEVEL_INIT
   
    POR_RESET();
   
    // System PSC setup - enable all
    DEVICE_PSCInit();
   
   DEVICE_pinmuxControl(0,0xFFFFFFFF,0x00FD0000); // All Video Inputs,Y0-Y7全部作为video in(不作为GPIO),GIO43作为SD1的clk,McBsp开启,MMCSD0关闭

  DEVICE_pinmuxControl(1,0xFFFFFFFF,0x00145555); // All Video Outputs,视频Cout0-Cout7作为色度信号输出使能,场消隐/行消隐同步信号使能,LCD的OE功能关闭

  DEVICE_pinmuxControl(2,0xFFFFFFFF,0x000000DA); // EMIFA,总线使能,但是CE0没有使能,0xDA可能在合众达板子上运行有问题,因为他将ce0设置成GPIO,这样nandflash失效了,我想可能是TI原版有个cpld,在合众达的测试程序,值为0x55。

  DEVICE_pinmuxControl(3,0xFFFFFFFF,0x00180000); // SPI0, SPI1, UART1, I2C, SD0, SD1, McBSP0, CLKOUTs,串口1使能,其他均作为GPIO,网卡没使能

  DEVICE_pinmuxControl(4,0xFFFFFFFF,0x55555555); //SI1-SPI4使能,MMCSD1使能
   
   GPIO->DIR02 &= 0xfeffffff;
    GPIO->CLRDATA02 = 0x01000000;
   
    // System PLL setup
    if (status == E_PASS) status |= DEVICE_PLL1Init(PLL1_Mult);
   
    // DDR PLL setup
    if (status == E_PASS) status |= DEVICE_PLL2Init();
   
    // DDR2 module setup
    if (status == E_PASS) status |= DEVICE_DDR2Init();
#endif
   
    // AEMIF Setup
    if (status == E_PASS) status |= DEVICE_EMIFInit();
   
    // UART0 Setup
    if (status == E_PASS) status |= DEVICE_UART0Init();
   
    // TIMER0 Setup
    if (status == E_PASS) status |= DEVICE_TIMER0Init();
   
    // I2C0 Setup
    if (status == E_PASS) status |= DEVICE_I2C0Init();
   
    return status;
}

     首先屏蔽和清除中断,然后调用DEVICE_PSCInit函数实现对各模块的电源时钟使能,实质是调用PSC电源时钟管理模块的寄存器实现,函数内容如下:

void DEVICE_PSCInit()
{   
    unsigned char i=0;
    unsigned char lpsc_start;
    unsigned char lpsc_end,lpscgroup,lpscmin,lpscmax;
    unsigned int PdNum = 0;
   
    lpscmin =0;
    lpscmax =2;
   
    for(lpscgroup=lpscmin ; lpscgroup <=lpscmax; lpscgroup++) {
        if(lpscgroup==0)
        {
            lpsc_start = 0; // Enabling LPSC 3 to 28 SCR first

            lpsc_end = 28;
        }
        else if (lpscgroup == 1) {
            lpsc_start = 38;
            lpsc_end = 47;
        } else {
            lpsc_start = 50;
            lpsc_end = 51;
        }
       
        //NEXT=0x3, Enable LPSC's
        for(i=lpsc_start; i<=lpsc_end; i++) {
            PSC->MDCTL[i] |= 0x3;
        }
       
        //Program goctl to start transition sequence for LPSCs
        PSC->PTCMD = (1<<PdNum);
       
        //Wait for GOSTAT = NO TRANSITION from PSC for Pdomain 0
        while(! (((PSC->PTSTAT>> PdNum) & 0x00000001) == 0));
       
        //Wait for MODSTAT = ENABLE from LPSC's
        for(i=lpsc_start; i<=lpsc_end; i++) {
            while(!((PSC->MDSTAT[i] & 0x0000001F) == 0x3));            
        }   
    }    
   
}

     然后调用DEVICE_pinmuxControl函数决定复用引脚的功能选择,详见数据手册查看引脚功能。

     接着调用DM36x/common/src/device.c下的DEVICE_PLL1Init函数实现了PLL1的配置,预分频,倍频,后分频,分频到各个模块,其设置顺序可以参看用户指南ARM子系统文档,有详细的介绍,PLL2类似,函数内容如下:

Uint32 DEVICE_PLL1Init(Uint32 PLLMult)
{
    unsigned int CLKSRC=0x0;             
    unsigned int j;
   
  
    PLL1->PLLCTL &= 0xFFFFFFFD;       
   
    PLL1->PLLCTL &= 0xFFFFFEFF;            
    PLL1->PLLCTL |= CLKSRC<<8;
   
  
    PLL1->PLLCTL &= 0xFFFFFFDF;   
   
  
    PLL1->PLLCTL &= 0xFFFFFFFE;
   
    UTIL_waitLoop(150);                
   
    // PLLRST=1(reset assert)
    PLL1->PLLCTL |= 0x00000008;
   
    UTIL_waitLoop(300);
   
    
    PLL1->PLLCTL &= 0xFFFFFFF7;
   
    //Program the Multiper and Pre-Divider for PLL1
    PLL1->PLLM = 0x51; // VCO will 24*2M/N+1 = 486Mhz

    PLL1->PREDIV = 0x8000|0x7;
   
    PLL1->SECCTL = 0x00470000; // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1
    PLL1->SECCTL = 0x00460000; // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0
    PLL1->SECCTL = 0x00400000; // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0
    PLL1->SECCTL = 0x00410000; // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1   
 
    //Program the PostDiv for PLL1
    PLL1->POSTDIV = 0x8000;
   
    // Post divider setting for PLL1    
    PLL1->PLLDIV2 = 0x8001;
    PLL1->PLLDIV3 = 0x8001; // POST DIV 486/2 -> MJCP/HDVICP
    PLL1->PLLDIV4 = 0x8003; // POST DIV 486/4 -> EDMA/EDMA CFG
    PLL1->PLLDIV5 = 0x8001; // POST DIV 486/2 -> VPSS
    PLL1->PLLDIV6 = 0x8011; // 27Mhz POST DIV 486/18 -> VENC
    PLL1->PLLDIV7 = 0x8000; // POST DIV 486/2 -> DDR
    PLL1->PLLDIV8 = 0x8003; // POST DIV 486/4 -> MMC0/SD0
    PLL1->PLLDIV9 = 0x8001; // POST DIV 486/2 -> CLKOUT

    UTIL_waitLoop(300);
   
    
    PLL1->PLLCMD = 0x00000001; // Go

    UTIL_waitLoop(300);
       
  
    while(! (((SYSTEM->PLL0_CONFIG) & 0x07000000) == 0x07000000));   
   
  
    PLL1->PLLCTL |= 0x00000001; // PLLEN=0
 
    return E_PASS;
}


Uint32 DEVICE_PLL2Init()
{

...


// Post divider setting for PLL2
     PLL2->PLLDIV2 = 0x8001; // 594/2 =297 Mhz -> ARM
     PLL2->PLLDIV4 = 0x801C; // POST DIV 594/29 = 20.48 -> VOICE
     PLL2->PLLDIV5 = 0x8007;

...


}

     继续在DEVICE_init函数中,下面是调用DEVICE_DDR2Init函数来配置DDR控制器,这是UBL中重要的一部分,如果硬件电路需要更换内存芯片的话,需要在UBL中修改这个函数,即按照芯片手册来配置DDR控制寄存器中的相关参数,比如时序,BANK数,页大小等。这个函数主要是操作SYS模块和DDR模块的相关寄存器来配置内存,函数中调用的DEVICE_LPSCTransition函数用来实现模块的电源时钟状态的改变,函数内容如下:

Uint32 DEVICE_DDR2Init()
{
    DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);
   
    SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR)& 0xFFFF9F3F;
   
    // Set bit CLRZ (bit 13)
    SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) | 0x00002000;
   
    // Check VTP READY Status
    while( !(SYSTEM->VTPIOCR & 0x8000));
   
    // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)
    //SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004000;

    // Set bit LOCK(bit7) and PWRSAVE (bit8)
    SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00000080;
   
    // Powerdown VTP as it is locked (bit 6)
    // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)
    SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004040;
   
    // Wait for calibration to complete
    UTIL_waitLoop( 150 );
   
    // Set the DDR2 to synreset, then enable it again
    DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);
    DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);
   
    DDR->DDRPHYCR = 0x000000C5;  
    DDR->SDBCR = 0x08D34832;        //Program SDRAM Bank Config Register
    DDR->SDBCR = 0x0853C832;   
    DDR->SDTIMR =0x3C934B51;        //Program SDRAM Timing Control Register1
    DDR->SDTIMR2 =0x4221C72;        //Program SDRAM Timing Control Register2
    DDR->PBBPR = 0x000000FE;  
    DDR->SDBCR = 0x08534832;        //Program SDRAM Bank Config Register  
    DDR->SDRCR = 0x00000768;        //Program SDRAM Refresh Control Register

    DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);
    DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);
   
    return E_PASS;
}

void DEVICE_LPSCTransition(Uint8 module, Uint8 domain, Uint8 state)
{
    // Wait for any outstanding transition to complete
    while ( (PSC->PTSTAT) & (0x00000001<< domain) );
   
    // If we are already in that state, just return
    if (((PSC->MDSTAT[module]) & 0x1F) == state) return;
   
    // Perform transition
    PSC->MDCTL[module] = ((PSC->MDCTL[module]) & (0xFFFFFFE0)) | (state);
    PSC->PTCMD |= (0x00000001<< domain);
   
    // Wait for transition to complete
    while ( (PSC->PTSTAT) & (0x00000001<< domain) );
   
    // Wait and verify the state
    while (((PSC->MDSTAT[module]) & 0x1F) != state);   
}

     而后调用DEVICE_EMIFInit函数来配置EMIF模块,这个模块用来接外存,比如NAND,NOR等。DM365有两个片选空间,如果某一空间配置成NAND,则需要在寄存器中设置,其函数内容如下:

Uint32 DEVICE_EMIFInit()
{   
    AEMIF->AWCCR = 0xff;  
    AEMIF->A1CR = 0x40400204; 
    AEMIF->NANDFCR |= 1; 
    AEMIF->A2CR = 0x00a00505;
   
    return E_PASS;  
}

     而后调用DEVICE_UART0Init函数来配置串口0,调用DEVICE_TIMER0Init函数来配置TIMER0,调用DEVICE_I2C0Init函数来配置I2C控制器,都是操作某一模块的控制寄存器实现,具体如何设置可以参考相关模块的手册,这三个函数的内容如下:

Uint32 DEVICE_UART0Init()
{   
    UART0->PWREMU_MGNT = 0; // Reset UART TX& RX components

    UTIL_waitLoop( 100 );
   
    UART0->MDR = 0x0;
    UART0->DLL = 0xd; // Set baud rate   
    UART0->DLH = 0;
    
    UART0->FCR = 0x0007; // Clear UART TX& RX FIFOs
    UART0->FCR = 0x0000; // Non-FIFO mode
    UART0->IER = 0x0007; // Enable interrupts

    UART0->LCR = 0x0003; // 8-bit words
    // 1 STOP bit generated,
    // No Parity, No Stick paritiy,
    // No Break control

    UART0->MCR = 0x0000; // RTS & CTS disabled,
    // Loopback mode disabled,
    // Autoflow disabled

    UART0->PWREMU_MGNT = 0xE001; // Enable TX& RX componenets

    return E_PASS;
}

Uint32 DEVICE_I2C0Init()
{
    I2C0->ICMDR = 0; // Reset I2C
    I2C0->ICPSC = 26; // Config prescaler for 27MHz
    I2C0->ICCLKL = 20; // Config clk LOW for 20kHz
    I2C0->ICCLKH = 20; // Config clk HIGH for 20kHz
    I2C0->ICMDR |= I2C_ICMDR_IRS; // Release I2C from reset
   
    return E_PASS;
}

Uint32 DEVICE_TIMER0Init()
{
    // Put timer into reset
    TIMER0->EMUMGT_CLKSPD = 0x00000003;
    TIMER0->TCR = 0x00000000;
   
    // Enable TINT0, TINT1 interrupt
    TIMER0->INTCTL_STAT = 0x00000001;
   
    // Set to 64-bit GP Timer mode, enable TIMER12 & TIMER34
    TIMER0->TGCR = 0x00000003;
   
    // Reset timers to zero
    TIMER0->TIM12 = 0x00000000;
    TIMER0->TIM34 = 0x00000000;
   
    // Set timer period (5 second timeout = (24000000 * 5) cycles = 0x07270E00)
    TIMER0->PRD34 = 0x00000000;
    TIMER0->PRD12 = 0x07270E00;
   
    return E_PASS;
}

     至此,DEVICE_init函数结束,程序返回至LOCAL_boot函数中,接着就调用NANDBOOT_copy函数了。

Screenshot_2026-11-04-16-26-45-46.jpg 立即下载

相关推荐

互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识

互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识

URL 的编码和解码

URL 的编码和解码 1 什么是 URL? URL(Uniform Resource Locator):统一资源定位符,它是用来表示互联网上的某个资源地址,互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。 URL 一般由三部组成: 协议(或称为服务方式)。 存有该资源的主机 IP 地址(有时也包括端口号)。 主机资源的具体地址。如目录和文件名等。 // 语法格式 // protocol://hostname[:port]/path[?query][#frag

工作、学习 1万+

【动态多智能体系统的通信感知编队控制】一种新颖的通信感知编队控制策略,用于动态多智能体系统研究(Matlab代码、Python代码实现)

内容概要:文档名为《Plecs全桥LLC谐振变换器仿真模型.txt》,但其内容并未深入介绍Plecs环境下全桥LLC谐振变换器的具体建模与仿真过程,而是呈现为一份涵盖多领域科研主题的资源列表。文档内容广泛涉及多智能体系统控制、无人机路径规划、电力电子变换器、状态估计、信号处理、优化算法等研究方向,并多次提及Matlab/Simulink、Python等工具的代码实现。整体来看,该文档更像是一份科研项目目录或技术资源索引,重点推介了包括LLC谐振变换器在内的多种控制系统与电力电子仿真模型,但对标题所述核心内容缺乏详尽的技术描述与实现细节。; 适合人群:电力电子、自动化、控制工程、信号处理及多智能体系统等相关领域的研究生、科研人员与工程技术人员。; 使用场景及目标:①为科研工作者提供跨学科的技术方向参考与研究选题灵感;②获取电力系统、无人机控制、信号处理等领域成熟的Matlab/Simulink或Python仿真代码资源,用于算法验证与模型复现。; 阅读建议:建议将此文档作为科研资源导航目录使用,读者可根据自身研究方向筛选感兴趣的主题,并通过文中提供的公众号或网盘链接获取完整的代码、仿真模型与配套资料进行深入学习与实践。

DM365的UBL源码分析

DM365是的启动方式有两种,通过BOOTSEL[2:0]引脚决定。当其为001时,直接从AEMIF上启 动,比如NOR和OneNAND。除此之外皆是从RBL启动,顺序为RBL-UBL-UBOOT-KERNEL,比如NAND,串口,SD卡等。RBL会 搜寻block1到block24去找UBL,关于RBL启动的详细细节可以参考用户指南关于ARM子系统的那篇文档,很详尽,下面只分析UBL的源码。

pointfish的专栏 2197

产业园区运营负责人如何提升企业技术需求与科研资源的精准匹配效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

unity中VideoPlayer播放视频,使用Shader除去黑底且无黑边

1. 创建一个Shader 和 一个 材质球;Shader中复制如下代码:(此Shader代码为“ChromaKeyKit”插件中的ChromaKey_Alpa_Genera代码,但因只需要除去视频黑底而挂一个插件有点不合适) // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "ChromaKeyKit/ChromaKey/ChromaKey_Alpha_General"

weixin_42065078的博客 1747

DM644X启动过程浅析

DM644X启动过程浅析  --------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://zhiqiang0071.cublog.cn--------------------------------------------

466

彩票预测的可能性与算法分析

彩票作为一种以随机数为基础的赌博形式,吸引了大量希望一夜暴富的参与者。尽管许多人希望通过某种方式预测彩票结果,以增加中奖几率,但彩票预测的可能性依然是一个充满争议和误解的话题。本文将探讨彩票是否能够预测的理论依据,分析可能的预测算法,并解释这些算法为何在实际应用中难以奏效。

m0_38012434的博客 2万+

DM365的UBL源码分析(一)

转自:http://blog.chinaunix.net/space.php?uid=7214824&do=blog&id=160521 DM365是的启动方式有两种,通过BOOTSEL[2:0]引脚决定。当其为001时,直接从AEMIF上启 动,比如NOR和OneNAND。除此之外皆是从RBL启动,顺序为RBL-UBL-UBOOT-KERNEL,比如NAN...

weixin_34378045的博客 214

Hi3516CV610开发板实战:从零搭建智能视觉监控系统

本文详细介绍了从零开始基于Hi3516CV610开发板搭建智能视觉监控系统的完整实战流程。涵盖硬件连接、系统配置、摄像头集成、网络设置、固件烧录到视频处理与智能分析功能开发,提供了丰富的实践经验和调试技巧,帮助开发者快速掌握嵌入式视觉系统开发。

vvv99的博客 564

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

Robot_PLC_HMI_Automation 1万+

DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zjbintsystem.blog.51cto.com/964211/713240     从盛夏走到深秋,我们继续DAVINCI DM365-DM368的开发。说来惭愧,人家51CTO热情支持本博客,而本人却一直没有像其他博客之星一样频繁更新博客,心里确实说不过去。管理

sydjm的专栏 1018

【RT-DETR有效改进】全新的SOATA轻量化下采样操作ADown(轻量又涨点,附手撕结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)首先可以大幅度降低参数值,其次其精度上也有很高的提升,同时本文的内容目前网络上并无其它人总结(也是最新发布的,可以说BUff是集满了)大家可以尝试以下在自己数据集上的效果。

Snu77的博客 4773

DM365的UBL源码分析(三)

转自:http://blog.chinaunix.net/space.php?uid=7214824&do=blog&id=160523 继续在DEVICE_init函数中,下面是调用DEVICE_DDR2Init函数来配置DDR控制器,这是 UBL中重要的一部分,如果硬件电路需要更换内存芯片的话,需要在UBL中修改这个函数,即按照芯片手册来配置DDR控制寄...

weixin_34343689的博客 138

AutoSAR系列讲解 - 前言

博主xyfx是一名汽车行业的嵌入式软件工程师,本职工作是同步电机的驱动控制(主要做FOC的,这个大家要是有兴趣,以后可以单独开一个专栏来讲解一下),由于做控制器的时候需要用到AutoSAR,所以特意的去学习了相关知识,同时博主自己也在同步提高中,有写的不合理的地方也请大家指正。我准备对AutoSAR开设两个大的方面来讲解,一是AutoSAR的入门篇,二是AutoSAR的实践篇,分别讲述AutoSAR的理论基础和工具的使用。

雪云飞星的博客 4万+

基于STM32设计的智能井盖(Lora组网+4G上云)_423

设计并实现了一种基于 STM32 与 Lora 通信技术的智能井盖监测系统。系统采用 STM32F103C8T6 作为核心控制器,在井盖节点端集成水位检测、有害气体检测、倾斜角度检测以及 GPS 定位等功能模块,对井盖内部环境状态和姿态变化进行实时监测。各井盖节点通过 Lora 无线通信方式组成网络,将采集的数据发送至主机(网关)进行汇聚处理。

719

DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12

本篇及以后的DM36X文章基本以DM368为主的介绍,因为DM365--- dvsdk_dm365_4_02_00_06和DM368----dvsdk_dm368_4_02_00_06的UBL,U-BOOT, KERNEL的源码完全是一样的,如果不考虑2A算法,DM368就是DM365的超频超出来的高清! 一、DM36X的BOOT过程介绍 DM36x的BOOT过程和

pointfish的专栏 4490

项目管理 Agent:进度追踪与风险预警 Harness

我们先从LangChain的Agent定义说起:Agent是一个能感知环境、自主决策、调用工具、执行动作、迭代反思的智能实体。而「项目管理全自主Agent」,就是把Agent的核心能力和项目管理的五大过程组(启动、规划、执行、监控、收尾)深度结合,聚焦执行监控阶段的两个核心痛点:进度偏差自动化计算、风险信号自动化识别与预警的专门化Agent。全感知(Omnisensing):能从。

AI架构师小马 516

DM365的UBL源码分析(四)

转自:http://blog.chinaunix.net/space.php?uid=7214824&do=blog&id=160528 下面继续分析,由于后面的代码和函数量相对的多且复杂,所以不再贴上代码,只说流程,只要把程序源码打开对着看很容易就明白了。 在DEVICE_init()这个大的平台初始化函数结束以后,下面要做的工作就是将...

weixin_34113237的博客 163

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

DM365的UBL源码分析(二)

转自:http://blog.chinaunix.net/space.php?uid=7214824&do=blog&id=160522 书接上回,看看UBL对平台的初始化,主要是调用了DEVICE_init函数,函数内容如下: Uint32 DEVICE_init()...

weixin_34380296的博客 231

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RBL 启动流程 代码分析

DM365是的启动方式有两种,通过BOOTSEL[2:0]引脚决定。当其为001时,直接从AEMIF上启 动,比如NOR和OneNAND。除此之外皆是从RBL启动,顺序为RBL-UBL-UBOOT-KERNEL,比如NAND,串口,SD卡等。RBL会 搜寻block1到block24去找UBL,关于RBL启动的详细细节可以参考用户指南关于ARM子系统的那篇文档,很详尽,下面只分析UBL的源码。  ...

sickbe的博客 978

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: Linux配置系统日志
下一篇: Linux下获得CPU利用率和内存使用情况(C实现)
pointfish
博客等级 码龄17年 58粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值