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

  • 相关阅读:
    马化腾:办公用QQ休闲用微信[Dream Catchers论坛]
    wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:WINDOWSTEMP/wordpress-4.tmp'
    如何精准化的做微信公众号运营?
    图像处理(卷积)作者太棒了
    What is an eigenvector of a covariance matrix?
    再谈协方差矩阵之主成分分析
    [转]浅谈协方差矩阵
    Deep Learning and the Triumph of Empiricism
    UML要点总结(一)
    Android TextView中有图片有文字混合排列
  • 原文地址:https://www.cnblogs.com/debruyne/p/9225730.html
Copyright © 2011-2022 走看看