zoukankan      html  css  js  c++  java
  • Uboot USB模式(RK3288变砖头的解决办法)

    RK3288启动后有三种模式,可以分别进行操作。

    第一种是normal也就是正常的启动模式。这个模式无法刷固件。一般板子通电就是这个模式

    第二种是loader模式。就是刷固件模式。这个模式可以刷各种image。按住recover按键再通电,通过uboot的检测进入这个模式

    第三种是MASKROM模式。这种模式用于拯救砖头机器。比如bootloader无法启动。无法进入loader正常下载。需要通过在板子上找对应的T13 C155 焊点,短接后通电,进入MASKROM模式,这些点需要问板子的生产商。 也可参考链接:http://www.t-firefly.com/doc/product/info/287.html

    对于模式的检测是在uboot里面进行的。如果uboot执行有问题。没法进入loader模式,就需要进入maskrom模式。检测的代码在uboot的board_late_init->board_fbt_preboot->board_fbt_key_pressed->checkKey() 根据按键的结果确定接下来执行哪一步。checkKey通过配置数据使用GetPortState函数得到是否有按键。

    配置的内容如下

    RockusbKeyInit中

    key->type = KEY_AD;
    key->key.adc.index = KEY_ADC_CN;
    key->key.adc.keyValueLow = 0;
    key->key.adc.keyValueHigh= 30;
    key->key.adc.data = SARADC_BASE;
    key->key.adc.stas = SARADC_BASE+4;
    key->key.adc.ctrl = SARADC_BASE+8;

    #define SARADC_BASE             RKIO_SARADC_PHYS

    在io-rk3288.h中

    #define RKIO_SARADC_PHYS                0xFF100000
    #define RKIO_SARADC_SIZE                SZ_64K

    接下来就是到芯片手册中看资料了

    http://rockchip.fr/RK3288%20TRM/

    http://wiki.t-firefly.com/index.php/Firefly-RK3288/RK3288_TRM

    三通道的模拟信号转数字信号

    Rockchip RK3288TRM V1.0 Technical Reference Manual.pdf

     

    可以看到地址FF100000是SAR-ADC的基地址

    内存地址从0-FF100000 16M-4GB大小

    key->key.adc.index = 1;  
        key->key.adc.keyValueLow = 0;  
        key->key.adc.keyValueHigh= 30;  
        key->key.adc.data = SARADC_BASE;  
        key->key.adc.stas = SARADC_BASE+4;  
        key->key.adc.ctrl = SARADC_BASE+8;  
    typedef struct  
    {  
        uint32  index;  
        uint32  keyValueLow;  
        uint32  keyValueHigh;  
        uint32  data;  
        uint32  stas;  
        uint32  ctrl;  
    }adc_conf;  

    对照SAR-ADC源码进行解析:

    for(tt = 0; tt < 10; tt++)  
    {  
        // read special gpio port value.  
        uint32 value;  
        uint32 timeout = 0;  
        /* 
        控制寄存器清零 
        初始化状态 
        */  
        write_XDATA32( adc->ctrl, 0);  
        DRVDelayUs(1);  
        /* 
        写入 0x0028| 1=0x29 
        第0 3 5 bit为1 
        0:2为001 表示选择输入源 Input source 1 (SARADC_AIN[1]) 
        第3bit为1 表示ADC电源启动 
        第5bit为1 表示开启中断 
        */  
        write_XDATA32( adc->ctrl, 0x0028|(adc->index));  
        DRVDelayUs(1);  
        do {  
            /* 
            接下来读取控制寄存器如果第6bit为0那么持续读取,直到第6bit为1 
            6bit是中断状态位,当转换结束以后会被设置为1,设置为0表示清除中断 
            */  
            value = read_XDATA32(adc->ctrl);  
            timeout++;  
        } while((value&0x40) == 0);  
        /* 
        前面的操作就是设置好输入源开启中断这些并开始转换。 
        然后等待转换结束 
        使用read_XDATA32(adc->data)读取数据 
        adc->data得到的是最后一次AD转换的值 
        */  
        value = read_XDATA32(adc->data);  
        //printf("adc key = %d
    ",value);  
        //DRVDelayUs(1000);  
          
        /* 
        如果最后一次AD转化的值处于keyValueLow和keyValueHigh之间。 
        表明电源被接通。计数器+1 
        keyValueLow和keyValueHigh控制着不同的按键类型? 
        */  
        if( value<=adc->keyValueHigh && value>=adc->keyValueLow)  
            hCnt++;  
    }  
    /* 
    清空初始化状态 
    如果10次里面有8次接通,那么说明电源按钮被按下。返回1 
    */  
    write_XDATA32( adc->ctrl, 0);  
    return (hCnt>8)  

    总之根据keyValueHigh和keyValueLow检测完不同的按键后就根据这些按键做对应的操作。比如进入loader模式还是normal模式

    如果进入的是rockusb那么执行 do_rockusb(NULL, 1, 0, NULL)

    参考复制自:https://blog.csdn.net/groundhappy/article/details/56280576

  • 相关阅读:
    北京燃气IC卡充值笔记
    随机分析、随机控制等科目在量化投资、计算金融方向有哪些应用?
    量化交易平台大全
    Doctor of Philosophy in Computational and Mathematical Engineering
    Institute for Computational and Mathematical Engineering
    Requirements for the Master of Science in Computational and Mathematical Engineering
    MSc in Mathematical and Computational Finance
    万字长文:详解多智能体强化学习的基础和应用
    数据处理思想和程序架构: 使用Mbedtls包中的SSL,和服务器进行网络加密通信
    31-STM32+W5500+AIR202/302基本控制篇-功能优化-W5500移植mbedtls库以SSL方式连接MQTT服务器(单向忽略认证)
  • 原文地址:https://www.cnblogs.com/debruyne/p/9225730.html
Copyright © 2011-2022 走看看