全志平台如何通过应用更改DDR频率

2023-07-01 14:38:50 浏览数 (3)

调试系统或者开发产品或者产品在客户使用过程中,我们经常需要调整DDR频率来进行运行测试或者发现DDR频率太高导致一些问题需要调整DDR频率,但是全志平台只能通过刷机来修改DDR频率,这在测试过程中或者用户使用过程中非常不方便,特别是机器到用户手上不可能拆机寄回重新刷机,那有没有办法通过安装应用来修改DDR频率呢?方法是有的,而且很简单。

经过研究发现/dev/block/mmcblk0是整个系统存放位置,DDR频率配置数据就在第9个块(每个块1K字节)的第56-59字节,checksum在第12-15字节,那么我们可以将这个位置数据全部拷贝出来,修改DDR频率和checksum后再将数据替换进去,这样通过应用就轻松修改了DDR频率。应用可以按如下步骤进行:

1,首先通过DD指令将/dev/block/mmcblk0的9K数据拷贝到/data目录下并给0755权限

dd if=/dev/block/mmcblk0 of=/data/boot0.img bs=1k count=9

chmod 0755 /data/boot0.img

2,读取/data/boot0.img数据的第9个块(每个块1K字节)的第56-59字节和第12-15字节分别存到变量mDDRCLK和mChecksum,并将读到的数据显示出来:

byte[] buffer = new byte[1024];

int length = 0;

mDDRCLK = 0;

mChecksum = 0;

while(length < 9)

{

myInput.read(buffer);

length ;

}

mChecksum |= (buffer[15]<<24)&0xff000000;

mChecksum |= (buffer[14]<<16)&0xff0000;

mChecksum |= (buffer[13]<<8)&0xff00;

mChecksum |= buffer[12]&0xff;

mDDRCLK |= (buffer[59]<<24)&0xff000000;

mDDRCLK |= (buffer[58]<<16)&0xff0000;

mDDRCLK |= (buffer[57]<<8)&0xff00;

mDDRCLK |= buffer[56]&0xff;

startButton.setText("DDR CLK:" mDDRCLK "M");

3,如果读出来的DDR频率和要修改的值不同,那么将DDR频率数据修改为目标值后再写回去,同时checksum也相应修改:

private void modifyBigDataToSD(String strOutFileName) throws IOException

{

InputStream myInput = new FileInputStream("/data/boot0.img"); ;

OutputStream myOutput = new FileOutputStream(strOutFileName);

byte[] buffer = new byte[1024];

int i = 0;

int length = myInput.read(buffer);

mDDRCLK = 0;

mChecksum = 0;

while(i < 8)

{

myOutput.write(buffer, 0, length);

length = myInput.read(buffer);

i ;

}

mChecksum |= (buffer[15]<<24)&0xff000000;

mChecksum |= (buffer[14]<<16)&0xff0000;

mChecksum |= (buffer[13]<<8)&0xff00;

mChecksum |= buffer[12]&0xff;

mDDRCLK |= (buffer[59]<<24)&0xff000000;

mDDRCLK |= (buffer[58]<<16)&0xff0000;

mDDRCLK |= (buffer[57]<<8)&0xff00;

mDDRCLK |= buffer[56]&0xff;

Log.d("tt","modifyBigDataToSD:checksum:0x" Integer.toHexString(mChecksum) " ddrclk:" Integer.toHexString(mDDRCLK));

if(mDDRCLK>720)

{

mChecksum -= (mDDRCLK-720);

mDDRCLK = 720;

buffer[15] = (byte)((mChecksum&0xff000000)>>24);

buffer[14] = (byte)((mChecksum&0xff0000)>>16);

buffer[13] = (byte)((mChecksum&0xff00)>>8);

buffer[12] = (byte)(mChecksum&0xff);

buffer[59] = (byte)((mDDRCLK&0xff000000)>>24);

buffer[58] = (byte)((mDDRCLK&0xff0000)>>16);

buffer[57] = (byte)((mDDRCLK&0xff00)>>8);

buffer[56] = (byte)(mDDRCLK&0xff);

}

Log.d("tt","modifyBigDataToSD22:checksum:0x" Integer.toHexString(mChecksum) " ddrclk:" Integer.toHexString(mDDRCLK));

myOutput.write(buffer, 0, length);

myOutput.flush();

myInput.close();

myOutput.close();

}

修改后通过DD指令写回/dev/block/mmcblk0(dd if=/data/boot01.img of=/dev/block/mmcblk0 bs=1k count=9)

4,数据写回后调用sync同步一下,然后通过1,2再检查一变是否写成功,写完后重启机器

5,重启机器后可以再次通过1,2步骤确认DDR频率是否改对或者通过读取/sys/kernel/debug/clk/pll_ddr0/clk_rate节点查看DDR频率

通过以上步骤我们可以方便的用应用去修改DDR频率,这样客户可以安装APK来自动修改匹配想要的DDR频率。

0 人点赞