-
下面的程序是产品验证过的。
#include "flash.h"
/*
**-----------------------------------------------------------------------------
**
** Abstract:
** 读FLASH选项字节的值
**
** Parameters:
** Address 选项字节地址
**
** Returns:
** 返回选项字节某个地址的值,高8位为Address的值,低8位为Address+1的值
**
**-----------------------------------------------------------------------------
*/
unsigned int Flash_ReadOptionByte(unsigned int Address)
{
unsigned char value_optbyte, value_optbyte_complement = 0;
unsigned int res_value = 0;
value_optbyte = *((@near unsigned char*)Address);
value_optbyte_complement = *(((@near unsigned char*)Address)+1);
res_value = (unsigned int)value_optbyte << 8;
res_value |= (unsigned int)value_optbyte_complement;
return(res_value);
}
/*
**-----------------------------------------------------------------------------
**
** Abstract:
** 擦除选项字节某个地址的值
**
** Parameters:
** Address 选项字节某个地址
**
** Returns:
** None
**
**-----------------------------------------------------------------------------
*/
void Flash_EraseOptionByte(unsigned int Address)
{
FLASH_CR2 |= 0x80; //对选项字节进行写操作
FLASH_NCR2 &= ~0x80;
*((@near unsigned char*)Address) = 0x00;
*((@near unsigned char*)(Address+1)) = 0xff;
Flash_WaitForLastOperation();
FLASH_CR2 &= ~0x80; //对选项字节写禁止
FLASH_NCR2 |= 0x80;
}
/*
**-----------------------------------------------------------------------------
**
** Abstract:
** 写选项字节某个址址的值
**
** Parameters:
** Address 选项字节某个地址 Data 要写的数据
**
** Returns:
** None
**
**-----------------------------------------------------------------------------
*/
void Flash_ProgramOptionByte(unsigned int Address, unsigned char Data)
{
FLASH_CR2 |= 0x80; //对选项字节进行写操作
FLASH_NCR2 &= ~0x80;
FLASH_DUKR = 0xae; //解除写保护密钥
FLASH_DUKR = 0x56;
*((@near unsigned char*)Address) = Data;
*((@near unsigned char*)(Address+1)) = ~Data;
Flash_WaitForLastOperation();
FLASH_CR2 &= ~0x80; //对选项字节写禁止
FLASH_NCR2 |= 0x80;
}
/*
**-----------------------------------------------------------------------------
**
** Abstract:
** 选项字节擦写等待
**
** Parameters:
** None
**
** Returns:
** None
**
**-----------------------------------------------------------------------------
*/
unsigned char Flash_WaitForLastOperation(void)
{
unsigned char flagstatus = 0;
unsigned int timeout = 0x1000;
while((flagstatus == 0)&&(timeout != 0))
{
flagstatus = FLASH_IAPSR & 0x05;
timeout--;
}
if(timeout == 0)
{
flagstatus = 0x02; //time out error
}
}
/*
**-----------------------------------------------------------------------------
**
** Abstract:
** 对选项字节的操作
**
** Parameters:
** Address 选项字节某个地址 Data 要写的数据
**
** Returns:
** None
**
**-----------------------------------------------------------------------------
*/
void Flash_OptionOperation(unsigned int Address, unsigned char Data, unsigned int Value)
{
unsigned int temp = 0;
do
{
temp = Flash_ReadOptionByte(Address);
if(temp != Value)
Flash_ProgramOptionByte(Address, Data);
if(temp == Value)
temp = 0;
}while(temp);
FLASH_IAPSR &= ~0x08; //EEPROM写保护使能
}
-
现象是驱动不足,滤波不好。请贴电路图。
-
用单片机自带的10位或者16位ad 就够了
-
自己先顶下。
呵呵
-
楼上正解。
库很好用的,特别对初学者来说。
文件多了点,但都很有序。
-
没弄过VxWorks,
帮顶下。
-
楼主你看看你系统的注册表下是否有[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]这条注册信息。
屏幕校正后CalibrationData键值会改变,如果在重启系统后CalibrationData键值又恢复到以前的值的话说明你没有实现HIVE注册表。
-
吃分,继续亢奋中!一路顺风!
-
先介绍一下项目,省得浪费表情
-
引用 5 楼 guopeixin 的回复:
引用 4 楼 guopeixin 的回复:
samsung flash驱动设计的问题,采用了所有r/w操作经由kerneliocontrol转接到oal的方式,所以优先级比较高,导致操作flash的时候系统cpu loading很高
如果想解决这个问题,可以改一下架构或者采用ms 的driver
另外,你点击触摸屏没有反应的时候,可不可以做如下尝试
1. 拷贝文件之前,在device上运行一个测试程序,如播放对象存储中音频文件的播放器,当触摸屏没有反应的时候看测试程序能够正常工作;
2. 在touch driver中每次检测到用户点击的时候输出log信息,看触摸屏没有反映的时候是否有中断的log信息输出
谢谢,1、如果如你所说,我把SD卡上的数据拷贝到Pocketmory1时,系统是正常的,又如何解释?
2、先打开SD卡上的音频文件播放,通过USB Mass Storage拷贝数据到Nand时,音频播放会停在那里,直到拷贝完成才继续播放。
-
UFN_Init
pContext->pUfnBus = new CUfnBus(pszContext, pContext);
pContext->pUfnBus->Init
//这里不知道总线驱动如何调用的BusIoControl
"BusIoctl"=dword:2a0048
CUfnBus::PostInit
dwRet = GetDefaultClientName(szClientName, dim(szClientName));
dwRet = CreateChild(szClientName, &pDevice);
CUfnBusDevice *pDevice = new CUfnBusDevice
pDevice->Init
DeviceFolder::Init()
//编译SerialUSBFn的时候使用了-DUSE_NEW_SERIAL_MODEL定义
//SerialUSBFn导出了一堆COM_XXX函数
源码Cserpdd.cpp (e:\ce60\public\common\oak\drivers\serial\serpddcm)
COM_INIT
SerInit
CSerialPDD * CreateSerialObject
pSerialPDD = new USBSerialFn(lpActivePath,pMdd, pHwObj);
pSerialPDD->Init()
CUsbFn::Init()
UfnInitializeInterface
fSuccess = BusChildIoControl(hBusAccess, IOCTL_UFN_GET_CLIENT_DATA_EX, &ucd, sizeof(ucd));
GetClientFunctions
UfnMdd_RegisterDevice
pdescClient = new CDescriptors;
CDescriptors::RegisterDevice
dwRet = pContext->PddInfo.pfnRegisterDevice(
UfnPdd_RegisterDevice
fErr = ActivateChild(m_szClientBusName);
UFN_MDD_INTERFACE_INFO MddInterfaceInfo = {
UFN_PDD_INTERFACE_VERSION, &UfnMdd_Notify
};
dwErr = UfnPdd_Init(pszContext, pContext, &MddInterfaceInfo, &pContext->PddInfo);
在CUsbFn::Init()已经调用
StartUSBFunction
******dwRet = m_pUfnFuncs->lpStart(m_hDevice, DeviceNotifyStub, this, &m_hDefaultPipe);
UfnMdd_Start
dwRet = pContext->PddInfo.pfnStart(pContext->PddInfo.pvPddContext);
UfnPdd_Start
启动IST_MAIN
初始化之后插入USB线之前,只有IST_MAIN中使能了SusPend Mode 和 EP0的中断
系统启动,插不插USB线USB_SUSPEND_INTR都会触发两次
插入USB线,中断就是没反应,ep0中断不触发
HandleUSBEvent
UfnMdd_Notify
UFN_MSG_SETUP_PACKET:
UFN_MSG_PREPROCESSED_SETUP_PACKET:
ProcessRequest
//整个USBFN代码里只有ProcessSetConfiguration函数发出了UFN_MSG_CONFIGURED的通知
//而pdd的driver里没有发现设置udr为USB_REQUEST_SET_CONFIGURATION的位置
//不清楚如何才能触发CableAttached
//如果有通知了,应该走下面
USB_REQUEST_SET_CONFIGURATION
ProcessSetConfiguration
SendDeviceNotification(pContext->lpDeviceNotify, pContext->pvDeviceNotifyParameter, dwMsg, dwParam);
DeviceNotifyStub
CUsbFn::DeviceNotify
UFN_MSG_CONFIGURED
CableAttached
OpenBulkIn
OpenBulkOut
OpenInterruptIn
CUsbFuncPipe::OpenPipe
m_pUfnFuncs->lpOpenPipe
UfnMdd_OpenPipe pPipe = FindPipe(pContext, dwEndpointAddress);
dwRet = pPipe->Open(pContext->Speed, NULL);
CPipeBase::Open
UfnPdd_InitEndpoint
-
先友情帮顶下。
-
自己解决了
-
顶下; 没有仿真器的情况下,可以多实验下;
我都用MCU驱动2.4寸的TFT,关键就靠分析--怀疑--有目的的试验--验证--成功。
-
用静态MFC库、拷贝到板子里看看
-
恭喜~
-
一般这种情况都是I/O引脚的负载超标导致的。
请检查VDD的电流。
-
或者麻烦推荐一款13位的低功耗DA
-
我使用自己定制的操作系统无法安装驱动。
??你想在那个系统中安装驱动?wince系统吗??
-
不好意思,刚才看了看UsbBuildGetDescriptorRequest,有个参数是设备描述符的指针,函数指定成功后,就得到设备描述符的指针了吧