您尚未登录。

#1 Re: 全志 SOC » F1c100s逆向了一下melis的TVD.DRV » 2020-04-01 20:12:52

拉轰的脚踏车 说:

请问下楼主,一楼这个是不是在Linux下使用呢?还是在裸机下使用?那段代码应该插入什么位置呢?是把CVBS的信号显示到LCD上面吗?

不好意思,萌新的问题有点多。

裸机下使用的
采集到的图像会存在0x80000000地址
可以通过下面这个函数判断是否检测到CVBS信号

static __u32 BSP_TVD_get_status(__u32 id)
{
	__u32 reg_val = 0;
	__u32 det = 0;
	__u32 system = 0;
	reg_val = REG_RD32(TVD_REGS_BASE+0x0e40);
	if(reg_val&1)
	{
		det = 0;// no signal detect
	}
	else
	{
		det = 1;// detect tv signal
	}
	if(reg_val&(1<<18))
	{
		system = 1;//get system = pal
	}
	else{
		system = 0;//get system = ntsc
	}

    __wrn("reg_val:0x%x, det:%d, system:%d\n", reg_val, det, system);
    
	return ((det<<0)+(system<<4));//bit0=det bit4=system
}

#2 全志 SOC » F1c100s逆向了一下melis的TVD.DRV » 2020-03-31 14:35:41

KeyMove
回复: 24

不废话直接上图
TIM图片20200331141457.jpg
D2.png

初始化部分

#define TVD_BASE 0x01C0B000
        ENABLE_BUSCLK(CCU_BUS_CLK_GATING_TVD_GATING);//BUS
	SETBIT(CCU->DRAM_CLK_GATE,BIT3);//DRAM
	
	CCU->PLL_VIDEO_CTRL=(1<<31);//VIDEO PLL
	while(!(CCU->PLL_VIDEO_CTRL&(1<<28)));//297MHz
	
	CCU->TVD_CLK=(1<<31)|(9);	//SEL VIDEO PLL
	
	mem32(TVD_BASE+0x0088)=0x4000000;
	
	mem32(TVD_BASE+0x0088)&=0xFEFFFFFF&0xFFFFFFEF;
	
	mem32(TVD_BASE+0x0E04) = 0x8002AAA8;
	mem32(TVD_BASE+0x0000) = 0x1F00;
	mem32(TVD_BASE+0x0F70) = 0x2010;
	mem32(TVD_BASE+0x0F0C) = 0x10;
	mem32(TVD_BASE+0x000C) = 0x202080;
	
	mem32(TVD_BASE+0x0F6C)=0xFFFA0A;
	mem32(TVD_BASE+0x0F44)=0x50823925;
	mem32(TVD_BASE+0x0F24)=0x682810A;
	mem32(TVD_BASE+0x0F28)=0x6440;
	mem32(TVD_BASE+0x0014)=0x20000000;
	mem32(TVD_BASE+0x0F4C)=0xE70106C;
	mem32(TVD_BASE+0x0010)=0x2310080;
	
	mem32(TVD_BASE+0x0008)=0x1101001;
	mem32(TVD_BASE+0x0F08)=0x11590902;
	mem32(TVD_BASE+0x0F0C)=0x40;
	mem32(TVD_BASE+0x0F10)=0x8A32EC;
	mem32(TVD_BASE+0x0F14)=0x800000A0;
	mem32(TVD_BASE+0x000C)=0x2080;
	mem32(TVD_BASE+0x0F1C)=0xDC0000;
	mem32(TVD_BASE+0x0F24)=0x682810A;
	mem32(TVD_BASE+0x0F28)=0x6440;
	mem32(TVD_BASE+0x0014)=0x20000000;
	mem32(TVD_BASE+0x0F44)=0x4632;
	mem32(TVD_BASE+0x0F4C)=0xE70106C;
	mem32(TVD_BASE+0x0F54)=0;
	mem32(TVD_BASE+0x0F58)=0x82;
	mem32(TVD_BASE+0x0F6C)=0xFFFA0A;
	mem32(TVD_BASE+0x0F80)=0x500000;
	mem32(TVD_BASE+0x0F84)=0xC10000;
	mem32(TVD_BASE+0x001C)=0x870026;
	mem32(TVD_BASE+0x0018)=0x2A098ACB;
	mem32(TVD_BASE+0x0F2C)=0xD74;
	mem32(TVD_BASE+0x0F74)=0x343;
	mem32(TVD_BASE+0x0E04)=0x8002AAA8;
	mem32(TVD_BASE+0x0040)=0x4000310;
	mem32(TVD_BASE+0x0000)=0x11;
	
	mem32(TVD_BASE+0x008C)=(mem32(TVD_BASE+0x008C)&(0xF800F000))|720|((576/2)<<16);
	
	mem32(TVD_BASE+0x0E2C)=0x110000;
	mem32(TVD_BASE+0x0000)=0x1F2F;
	mem32(TVD_BASE+0x0F20)=0x2C0607;
	mem32(TVD_BASE+0x0E28)=0x10026;
	mem32(TVD_BASE+0x0FE0)=0;

	mem32(TVD_BASE+0x0E04)&=~1;
	
	mem32(TVD_BASE+0x0080)=0x80000000;
	mem32(TVD_BASE+0x0088)|=0x10000000u;
	
	mem32(TVD_BASE+0x0084)=0x80000000+1000000;
	mem32(TVD_BASE+0x0088)|=0x10000000u;
	
	SETBIT(mem32(TVD_BASE+0x0088),BIT0);

参考了之前A20 TVD的DRV的写法去猜寄存器的地址以及功能
好几个参数都是蒙对的
只能说这次有很大的运气成分
通过IDA逆向分析使用0xF1C0B000(不知道为什么是0xF1C0B000而不是0x01C0B000)作为基址的寄存器操作。然后根据现有的头文件去猜功能。
不过依然操作全是黑箱,不知道寄存器代表啥只能靠逆向出来的寄存器操作去初始化。也有一定的局限性。
之前不了解CVBS需要27MHz时钟用,24MHz调试了半天都没出来效果。偶然间才看见CVBS需要27MHz时钟。

驱动文件
tvd.zip

#3 Re: 全志 SOC » F1C100S有人裸机跑过SPI跟DMA吗 » 2019-12-24 20:09:38

SPI1的IO驱动能力不足
spi1.jpg
CLK只能到34M了
ugui0.gif

#4 全志 SOC » F1C100S有人裸机跑过SPI跟DMA吗 » 2019-12-19 02:33:38

KeyMove
回复: 7
void InitSPI1(){
	GPIOA->CFG[0]&=0xffff0000;
	GPIOA->CFG[0]|=0x00001661;
	
	SETBIT(CCU->BUS_SOFT_RST0,1<<CCU_BUS_CLK_GATING_SPI1_GATING);
	ENABLE_BUSCLK(CCU_BUS_CLK_GATING_SPI1_GATING);
	SPI1->CCR=0x00001000+2;
	SPI1->GCR=SPI_GCR_SRST|SPI_GCR_MODE|SPI_GCR_TP_EN|SPI_GCR_EN;
	while(SPI1->GCR&SPI_GCR_SRST);
	SETBIT(SPI1->TCR,SPI_TCR_CPOL|SPI_TCR_CPHA|SPI_TCR_SS_OWNER);//SPI_TCR_CPOL|SPI_TCR_CPHA|
	SETBIT(SPI1->FCR,SPI_FCR_RF_RST|SPI_FCR_TX_FIFO_RST|SPI_FCR_TF_DRQ_EN);
}

void InitDMA(){
	ENABLE_BUSCLK(CCU_BUS_CLK_GATING_DMA_GATING);
	SETBIT(CCU->BUS_SOFT_RST0,1<<CCU_BUS_CLK_GATING_DMA_GATING);
	DMA->NDMA[0].CFG=NDMA_CFG_DESTINATION_DRQ_TYPE_CONFIDENTIAL_SET(NDMA_CFG_DRQ_SPI1_TX)|NDMA_CFG_SOURCE_DRQ_TYPE_SET(NDMA_CFG_DRQ_SDRAM_MEMORY)|NDMA_CFG_SOURCE_ADDRESS_TYPE_SET(NDMA_CFG_ADDRESS_LINEAR_MODE)|NDMA_CFG_DESTINATION_ADDRESS_TYPE_SET(NDMA_CFG_ADDRESS_IO_MODE)|NDMA_CFG_REMAIN_BYTE_COUNTER_READ_ENABLE|NDMA_CFG_WAIT_STATE_SET(NDMA_CFG_WAIT_STATE2);
	DMA->NDMA[0].SRC_ADR=(u32)&lcdbuff;
	DMA->NDMA[0].DES_ADR=(u32)&SPI1->TXD;
}

void flushDMA(){
	SPI1->MBC=SPI1->MTC=SPI1->BCC=DMA->NDMA[0].BYTE_CNT=240*320*2;
	SETBIT(DMA->NDMA[0].CFG,NDMA_CFG_LOADING);
	SETBIT(SPI1->TCR,SPI_TCR_XCH);
	while(DMA->NDMA[0].CFG&NDMA_CFG_BUSY_STATUS)SPI1->RXD;
	SETBIT(SPI1->ISR,SPI_ISR_TC);
	while(!(SPI1->ISR&SPI_ISR_TC))SPI1->RXD;
}
u8 lcdbuff[240*320*2] __attribute__((at(0x80000000)));
for(cnt=0;cnt<240*320;cnt++)lcdbuff[cnt]=0xff;
for(cnt=0;cnt<240*320;cnt++)lcdbuff[cnt+240*320]=0x0;
InitDMA();
ST7789_CS_CLR();
flushDMA();
ST7789_CS_SET();

我试了一下效果
https://whycan.cn/files/members/2421/shua.mp4

测试的过程中发现SPI的RXD如果不读也会卡住SPI,不知道有没有忽略RXD的方法。

#5 全志 SOC » F1C100S的SRAM A能访问吗 » 2019-12-17 17:40:01

KeyMove
回复: 2

手册上的SRAM A
SRAM A 0x0001 0000---0x0001 9FFF 40K
f1c100s

改动无效
f1c100s

BROM的整个32K是可以读写没问题的

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn