2017年7月问题记录与总结——16位nvram读写对齐操作

16位nvram读写地址对齐方法,当以4字节32位方式往nvram的奇地址读写数据的时候,需要注意对齐的问题,因为数据只能16位16位的往里面写,这里采用一个2个字节的数组来作为对齐的中间buff,具体操作见源码。

/********************************************************************************************
 * 功能:从nvRam中获取缓存的数据
 * 
 * 参数:
 *       pBuf   将获取的数据缓存起来的地址空间
 *       len    获取的数据长度
 *       offset 数据在nvRam中存放位置的偏移值
 *       
 * 返回值:
 *       OK     正常获取到读取的nvRam值
 *       ERROR  参数不合法的时候的返回值
 */
int nv_ram_get(char * pBuf, UINT32 len, UINT32 offset)
{
	volatile UINT16 * pMem16;
	int               i;
	int               end;
	UINT8             word[2];
	
	/* 检查输入的参数值是否合法 */	
	if((pBuf == NULL) ||(offset > NVRAM_SIZE) ||((offset+len) > NVRAM_SIZE) )
	{
		return ERROR;
	}
	
	
	/* 获取0长度的数据则直接返回 */	
	if(len == 0)
	{
		return OK; 
	}
	
	
	/* 设置获取数据的范围(起始值,最终位置) */	
	end = (UINT32)len;	
	pMem16 = (UINT16 *)(NVRAM_BASE_ADRS + offset);
	
	nvRamUnlock_Read();
	/*读取字节对齐处理*/
	if ((UINT32)pMem16 & 0x1)
	{
		*(UINT16*)word = *(UINT16 *)((UINT32)pMem16 - 1);
		pBuf[0] = word[1];
	
		pMem16  = (UINT16 *)((UINT32)pMem16 + 1);
		pBuf++;
		end--;
	}
	
	/* 读取对齐字节余下的字节 */	
	for( i = 0; i < end/2; i++)
	{     
		*(UINT16 *)&pBuf[i*2] = *pMem16++;
	}
	
	/* 读取最后的对齐字节如果对齐结果正好无余 */	
	if(end & 0x1)
	{
		*(UINT16*)word = *pMem16;
		pBuf[end-1] = word[0];
	}
	
	return OK;
}
/****************************************************************************
*
* nvRamSet
* 功能:               将数据写入到nvRam中
*
* 参数:
*         pBuf  : 要写入nv的缓存数据空间
*         len   : 要写入的数据的长度
*         offset: 写入的数据偏移nvRam起始位置的偏移值
* 返回值:
*         OK    : 写入成功
*         ERROR : 失败
*/ 
int nv_ram_set(const char * pBuf, UINT32 len, UINT32 offset)
{
	volatile UINT16 * pMem16;
	int               i;
	int               end;
	UINT8             word[2];
	
	/* 参数检查 */
	if((pBuf == NULL) ||(offset > NVRAM_SIZE) ||((offset+len) > NVRAM_SIZE) )
	{
		return ERROR;
	}
	
	
	/* 写入长度为0的话直接返回 */	
	if(len == 0)
	{
		return OK;
	}
	
	
	/* 设置指针的值 */	
	end = (UINT32)len;
	pMem16 = (UINT16 *)(NVRAM_BASE_ADRS + offset);
	
	nvRamUnlock_Write();
	/*对齐处理*/
	if ((UINT32)pMem16 & 0x1)
	{
		//第一块非对齐数据块的处理
		*(UINT16*)word = *(UINT16 *)((UINT32)pMem16 - 1);
		word[1] = pBuf[0];
		*(UINT16 *)((UINT32)pMem16 - 1) = *(UINT16*)word;
		
		/*调整指针和指向*/		
		pMem16  = (UINT16 *)((UINT32)pMem16 + 1);
		pBuf++;
		end--;
	}
	
	/* 剩余数据块的写 */	
	for ( i = 0; i < end/2; i++)
	{
		*pMem16++ = *(UINT16 *)&pBuf[i*2];
	}
	
	/* 如果需要的话写最后一个非对齐的字节 */	
	if (end & 0x1)
	{
		*(UINT16 *)word = *pMem16;		
		word[0] = pBuf[end-1];		
		*pMem16 = *(UINT16*)word;
	}
	return OK;
}

在Android框架中,NVRAM(非易失性随机存储器)被用于存储系统相关的配置和参数,如无线通信模块的MAC地址、IMEI号码等。NVRAM的读写在Android设备的系统级别中发挥重要作用。 首先,NVRAM读取功能在Android框架中由系统服务提供,通过封装底层的硬件接口和驱动程序来实现。Android的系统服务负责与硬件之间的通信,从NVRAM中读取所需的参数。在读取过程中,通过定义和使用适当的API,应用程序或系统组件可以请求读取特定的NVRAM值,以进行相关的操作和功能。 其次,NVRAM的入功能也是由系统服务提供的。当应用程序或系统组件需要修改某个NVRAM参数时,可以通过调用相应的API来实现。系统服务将接收到的修改请求转发给硬件接口和驱动程序,然后将新值入NVRAM中。这样,NVRAM中对应的参数将被更新,以满足新的需求。 在Android框架中,NVRAM读写功能的正确实现对于系统的正常运行非常重要。它确保各种系统组件可以正确访问配置和参数信息,并确保设备在启动时能够正确初始化。同时,NVRAM的读写操作需要受到适当的权限控制,只有具备足够权限的应用程序或系统组件才能进行相关的操作。 综上所述,Android框架中的NVRAM读写功能通过系统服务提供,并且在系统级别中发挥重要作用。这种功能确保了系统配置和参数的正确访问和修改,从而保障设备的正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值