RK3288的几种USB模式

https://blog.csdn.net/groundhappy/article/details/56280576

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函数得到是否有按键。

配置的内容如下

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 TRM/
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\n",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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值