打印
[技术问答]

新唐NUC972想实现IAP功能, 祼机版

[复制链接]
1254|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leiwu2002|  楼主 | 2020-3-31 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
芯片内部ROM引导程序从片外NANDFLASH将IAP程序复制到内存的0x00000000开始的地址执行,
然后自已写的AIP程序再从片外NANDFLASH将APP程序复制到内存0x00100000开始的地址, 然后跳转到0x00100000执行APP程序, 现在能正常的跳转到APP执行程序, 但无法时入中断处理,  请教下各位大神, 中断方面要怎么么外理?

使用特权

评论回复
沙发
leiwu2002|  楼主 | 2020-3-31 10:49 | 只看该作者
本帖最后由 leiwu2002 于 2020-3-31 10:55 编辑

跳转代码如下:
void JumpApp(void)
{
        unsigned char *ptr;
        unsigned char *_ch;
        uint16_t udBlockNo;
        uint16_t udBlockSize;
        uint32_t uwAppNandAddr;
        uint32_t uwAppRamAddr;
        __attribute__ ((noreturn)) void (*App)(void);
        
        uwAppRamAddr = 0x00100000;
        uwAppNandAddr = 0x00200000;
        udBlockSize = 0x20000;
        
        _ch = (unsigned char*)((unsigned int)uwAppRamAddr);
        ptr = _ch;
        memset(ptr, 0, udBlockSize);        
        udBlockNo = uwAppNandAddr/udBlockSize;
        Read_Nand((uint32_t)(uwAppRamAddr), udBlockNo, udBlockSize);
        
        //Jump to App        
        App = (void *)((uint32_t)uwAppRamAddr);
         (*App)();
}

使用特权

评论回复
板凳
leiwu2002|  楼主 | 2020-3-31 10:53 | 只看该作者
APP的执行代码如下, run led2部分无法正常执行, 因为无法正常进入中断

void DelayUs(uint32_t uwUs)
{
        //300MHz主频
        uwUs = uwUs * 75;               
        for (; uwUs>0; uwUs--) {
                // 4 NOP
        }
}

int main(void)
{       
        // Disable all interrupts.
        outpw(REG_AIC_MDCR, 0xFFFFFFFE);
        outpw(REG_AIC_MDCRH, 0x3FFFFFFF);
       
        GPIO_OpenBit(GPIOB, BIT0, DIR_OUTPUT, PULL_UP);
        GPIO_OpenBit(GPIOB, BIT1, DIR_OUTPUT, PULL_UP);
       
  while(1){       
                //run led1
                DelayUs(500000);
                GPIO_Set(GPIOB, BIT0);
                DelayUs(500000);
                GPIO_Clr(GPIOB, BIT0);
               
                //run led2
                sysDelay(50);
                GPIO_Set(GPIOB, BIT1);
                sysDelay(50);
                GPIO_Clr(GPIOB, BIT1);
        }       
}       

使用特权

评论回复
地板
wanduzi| | 2020-3-31 10:56 | 只看该作者
去码云或者github看看他们提供的例子。

使用特权

评论回复
5
leiwu2002|  楼主 | 2020-3-31 11:10 | 只看该作者
wanduzi 发表于 2020-3-31 10:56
去码云或者github看看他们提供的例子。

没有找到类似的例子, 你有相关链接吗? 谢谢

使用特权

评论回复
6
wanduzi| | 2020-3-31 15:04 | 只看该作者
没用过这个

使用特权

评论回复
7
玛尼玛尼哄| | 2020-3-31 21:25 | 只看该作者
没用过这个系列。

使用特权

评论回复
8
leiwu2002|  楼主 | 2020-4-3 17:19 | 只看该作者
有了解的大神吗? 指点一下

使用特权

评论回复
9
leiwu2002|  楼主 | 2020-4-26 16:22 | 只看该作者
通过u-boot加入自己的代码, 实现了祼机版的IAP功能

使用特权

评论回复
10
huangcunxiake| | 2020-4-26 19:51 | 只看该作者
leiwu2002 发表于 2020-4-26 16:22
通过u-boot加入自己的代码, 实现了祼机版的IAP功能

楼主分享分享成果啊。

使用特权

评论回复
11
leiwu2002|  楼主 | 2020-4-27 09:00 | 只看该作者
1./common/main.c->main_loop函数中插入自己的主循环函数
void main_loop(void)
{
        const char *s;

        bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop");

#ifdef CONFIG_VERSION_VARIABLE
        setenv("ver", version_string);  /* set version variable */
#endif /* CONFIG_VERSION_VARIABLE */

        cli_init();

        run_preboot_environment_command();

#if defined(CONFIG_UPDATE_TFTP)
        update_tftp(0UL, NULL, NULL);
#endif /* CONFIG_UPDATE_TFTP */

        //start custom function
        RemoteUpdateLoop();                //       
        //end coutom function

        s = bootdelay_process();
        if (cli_process_fdt(&s))
                cli_secure_boot_cmd(s);       

        autoboot_command(s);

        cli_loop();
        panic("No CLI available");
}

2.在自己的自定义的功能函数中, 完成通讯口的初始化工作(比如485通讯口\以太网口等),
然后接收程序文件, 再烧写到NandFlash指定的位置, 完成更新后再跳出自己的主循环即可.
void RemoteUpdateLoop(void)
{
        FlashInit();                                       
        RunInit();                                               
        RemoteUpdateInit();               
        UsartInit();

        while(1)
        {
                SystickMain();
                UsartMain();
                RunMain();
                FlashMain();
                RemoteUpdateMain();
                if(m_ucJumpToApp) break;
        }
}

3.读写NandFalsh时, 调用uboot的读写命令完成读写工作
sprintf(cmd, "nand erase 0x%08x 0x%08x", ApplicationAddress, uwLen);
run_command(cmd, 0);
sprintf(cmd, "nand write 0x%08x 0x%08x 0x%08x", DATABUF_SDRAM_ADDR|NON_CACHE, uwFlashDestination, uwLen);
run_command(cmd, 0);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

20

帖子

0

粉丝