前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全志平台如何通过应用更改DDR频率

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

原创
作者头像
kaicer
发布2023-07-01 14:38:50
4830
发布2023-07-01 14:38:50
举报
文章被收录于专栏:软件技术交流

调试系统或者开发产品或者产品在客户使用过程中,我们经常需要调整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频率。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档