完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RK3288启动后有三种模式,可以分别进行操作。
一种是normal也就是正常的启动模式。这个模式无法刷固件。 一般板子通电就是这个模式 第二种是loader模式。就是刷固件模式。这个模式可以刷各种image。 按住recover按键再通电,通过uboot的检测进入这个模式 第三种是MASKROM模式。这种模式用于拯救砖头机器。比如bootloader无法启动。无法进入loader正常下载。 需要通过在板子上找对应的T13 C155 焊点,短接后通电,进入MASKROM模式,这些点需要问板子的生产商。 对于模式的检测是在uboot里面进行的。如果uboot执行有问题。没法进入loader模式,就需要进入maskrom模式。 检测的代码在uboot的board_late_init->board_fbt_preboot->board_fbt_key_pressed->checkKey() 根据按键的结果确定接下来执行哪一步。 checkKey通过配置数据使用GetPortState函数得到是否有按键。 配置的内容如下 Rocku***KeyInit中 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 接下来就是到芯片手册中看资料了 三通道的模拟信号转数字信号 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 = %dn",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模式 如果进入的是rocku***那么执行 do_rocku***(NULL, 1, 0, NULL) |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
1043 浏览 0 评论
1220 浏览 1 评论
968 浏览 1 评论
2238 浏览 1 评论
3561 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 23:48 , Processed in 0.824342 second(s), Total 70, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号