RK3288的几种USB模式

本文介绍了RK3288芯片的三种启动模式:normal模式、loader模式及MASKROM模式,并详细解析了如何通过按键检测进入不同模式的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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%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\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)






### RK3588 USB摄像头全屏显示配置方法 在RK3588平台上实现USB摄像头的全屏显示,通常涉及以下几个方面:硬件初始化、驱动加载以及应用层设置。以下是详细的说明: #### 1. 硬件初始化与Pinmux配置 Rockchip平台中的Pinmux配置文件`rockchip-pinconf.dtsi`定义了各种外设的功能引脚配置[^1]。对于USB接口而言,需要确保其对应的GPIO被正确分配并启用。 - **Pinmux配置** 在DTS(Device Tree Source)中,需确认USB端口的相关pinmux已正确定义。例如: ```dts &usb_host0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&usbo_host0_pins>; }; ``` - **电源管理单元 (PMU)** 如果USB摄像头需要额外供电,则可能还需要调整PMIC(Power Management IC)参数以支持更高的电流输出。 #### 2. Linux内核驱动适配 为了使USB摄像头能够正常工作,必须加载相应的V4L2(Video4Linux2)子系统模块,并验证设备节点是否存在。 - **检查设备节点** 使用命令 `ls /dev/video*` 查看是否有可用视频设备节点生成。 - **加载必要驱动程序** 对于大多数基于ARM架构的SoC来说,默认情况下会自动探测并绑定合适的驱动器到总线上的任何新连接设备;但如果未成功识别目标型号,则可以尝试手动指定模组名称来强制安装它。比如执行如下操作可能会有所帮助: ```bash modprobe uvcvideo dmesg | grep -i usb # 检查日志消息了解当前状态如何变化 ``` #### 3. 应用层面处理图像流数据 当底层框架准备好之后,在应用程序里就可以通过调用API函数获取实时画面帧数并通过窗口展示出来达到最终效果——即所谓的“全屏模式”。 一种简单的方式就是利用GStreamer工具链构建管道完成这一过程。下面给出了一段示例代码片段用于演示目的: ```c #include <gst/gst.h> int main(int argc, char *argv[]) { GstElement *pipeline; gst_init(&argc,&argv); pipeline = gst_parse_launch( "v4l2src device=/dev/video0 ! videoconvert ! autovideosink", NULL); g_signal_connect(pipeline,"about-to-finish",(GCallback)on_pipeline_finished,NULL); gst_element_set_state(pipeline,GST_STATE_PLAYING); gst_bus_timed_pop_filtered(GST_BUS(gst_pipeline_get_bus(GST_PIPELINE(pipeline))), GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR|GST_MESSAGE_EOS); gst_object_unref(pipeline); } ``` 此段源码创建了一个基本播放管线,其中包含了来自特定物理地址(/dev/videoX)的数据采集组件(v4l2src),接着经过色彩空间转换(videoconvert),最后送入图形渲染引擎(autovideosink). 另外值得注意的是某些高级特性如缩放比例设定或者旋转角度控制也可以在此基础上进一步扩展实现. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值