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