📄 adc.c
字号:
输出参数:
返 回:
*******************************************************************************************/
PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
RETAILMSG(1, (TEXT("ADC : DLL_PROCESS_ATTACH\r\n")));
DisableThreadLibraryCalls((HMODULE) hInstDll);
break;
case DLL_PROCESS_DETACH:
RETAILMSG(1, (TEXT("ADC: DLL_PROCESS_DETACH\r\n")));
break;
}
return (TRUE);
}
/*******************************************************************************************
函数名称: ADC_Close
描 述: 驱动程序关闭函数
输入参数: DWORD Handle:驱动程序引用事例句柄
输出参数: 无
返 回: FALSE: 失败 TRUE: 成功
*******************************************************************************************/
BOOL ADC_Close(DWORD Handle)
{
if (m_ADC_OpenCout > 0)
{
// 恢复 ADC 寄存器原来的设置值
v_pADCregs->ADCCON = m_tmp_ADCCON;
v_pADCregs->ADCTSC = m_tmp_ADCTSC;
v_pADCregs->ADCDLY = m_tmp_ADCDLY;
}
m_ADC_OpenCout = 0; /* 打开计数器恢复为0 */
return TRUE;
} // ADC_Close
/*******************************************************************************************
函数名称: ADC_Deinit
描 述: 驱动程序卸载函数
输入参数: DWORD dwContext: 驱动程序句柄
输出参数: 无
返 回: FALSE: 失败 TRUE: 成功
*******************************************************************************************/
BOOL ADC_Deinit(DWORD dwContext)
{
m_ADC_OpenCout = 0; /* 打开计数器恢复为0 */
if (v_pADCregs)
VirtualFree((PVOID) v_pADCregs, 0, MEM_RELEASE); /* 释放申请的虚拟空间 */
return TRUE;
} // ADC_Deinit
/*******************************************************************************************
函数名称: ADC_Open
描 述: 打开驱动程序
输入参数: DWORD dwData : 设备驱动程序句柄
DWORD dwAccess : 访问请求代码,是读和写的组合
DWORD dwShareMode: 共享模式
输出参数:
返 回: 驱动程序引用事例句柄
*******************************************************************************************/
DWORD ADC_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
if (m_ADC_OpenCout > 0)
return 0; /* 本驱动只允许单访问 */
m_ADC_OpenCout++; /* 打开计数器计数 */
// 初始化 ADC 寄存器
ADC_InitializeRegister(m_s3c2410_pclk);
// 获取 ADC 转换最大/小频率
ADC_GetLimitFreqency(m_s3c2410_pclk, &m_ADC_MaxFreq, &m_ADC_MinFreq);
return m_ADC_OpenCout;
} // ADC_Open
/*******************************************************************************************
函数名称: ADC_IOControl
描 述: 驱动程序 I/O 请求
输入参数:
输出参数:
返 回: 本驱动不支持该请求,返回 FALSE
*******************************************************************************************/
BOOL
ADC_IOControl(
DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
)
{
BOOL bErr = FALSE;
switch (dwIoControlCode)
{
case IOCTL_SET_ADC_CHANNEL: /* 设置ADC转换通道 */
if ((nInBufSize > 0) && (pInBuf[0] <= ADC_CHANNEL_NUM))
{
v_pADCregs-> ADCCON &= ~(ADCCON_CHANNEL_MSK);
v_pADCregs-> ADCCON |= (pInBuf[0] << 3); /* 写入通道号 */
bErr = TRUE;
}
break;
case IOCTL_SET_ADC_FREQUENCY: /* pInBuf和pOutBuf都为DWORD型 */
if ((nInBufSize > 0) && (nOutBufSize > 0))
{
/* 设置 ADC 转换频率(Hz) */
*(DWORD *)pOutBuf = ADC_SetFreqency(m_s3c2410_pclk, *(DWORD *)pInBuf);
*pBytesReturned = 1;
bErr = TRUE;
}
break;
case IOCTL_GET_ADC_CURFREQ: /* pOutBuf 为 DWORD */
if (nOutBufSize > 0)
{
/* 取得 ADC 当前转换频率(Hz) */
*(DWORD *)pOutBuf = ADC_GetCurFreqency(m_s3c2410_pclk);
*pBytesReturned = 1;
bErr = TRUE;
}
break;
case IOCTL_SET_ADC_MAXFREQ: /* pOutBuf 为 DWORD */
if (nOutBufSize > 0)
{
/* 取得 ADC 最高转换频率(Hz) */
*(DWORD *)pOutBuf = m_ADC_MaxFreq;
*pBytesReturned = 1;
bErr = TRUE;
}
break;
case IOCTL_SET_ADC_MINFREQ: /* pOutBuf 为 DWORD */
if (nOutBufSize > 0)
{
/* 取得 ADC 最低转换频率(Hz) */
*(DWORD *)pOutBuf = m_ADC_MinFreq;
*pBytesReturned = 1;
bErr = TRUE;
}
break;
default:
break;
}
return bErr;
} // ADC_IOControl
/*******************************************************************************************
函数名称: ADC_Read
描 述: 读取当前通道的 ADC 转换值
输入参数: DWORD Handle : 驱动程序引用事例句柄
LPVOID pBuffer : 接收缓冲区
DWORD dwNumBytes: 要读的字节数
输出参数: 无
返 回: 实际读到字节数
*******************************************************************************************/
DWORD ADC_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
ushort *pReadBuffer;
UINT32 i;
if ((pBuffer == NULL) || (dwNumBytes == 0))
return 0;
pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());
v_pADCregs->ADCCON |= ADCCON_EN_READSTART;
v_pADCregs->ADCDAT0; /* 读启动转换 */
for (i = 0; i < dwNumBytes; i++)
{
while(!(v_pADCregs->ADCCON & ADCCIN_CONVERT_END)); /* 等待 ADC 转换结束*/
*pReadBuffer = v_pADCregs->ADCDAT0 & 0x3ff;
pReadBuffer++;
}
return i;
}
/*******************************************************************************************
函数名称: ADC_Write
描 述: 写函数,本驱动不支持
输入参数:
输出参数:
返 回:
*******************************************************************************************/
DWORD ADC_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
return 0;
}
/*******************************************************************************************
函数名称: ADC_Seek
描 述: 对设备的数据指针进行操作,本驱动不支持该函数
输入参数:
输出参数:
返 回:
*******************************************************************************************/
DWORD ADC_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
return 0;
}
/*******************************************************************************************
函数名称: ADC_PowerUp
描 述: 电源上电驱动处理函数
输入参数:
输出参数:
返 回: 无
*******************************************************************************************/
void ADC_PowerUp(void)
{
return;
}
/*******************************************************************************************
函数名称: ADC_PowerDown
描 述: 电源下电驱动处理函数
输入参数:
输出参数:
返 回: 无
*******************************************************************************************/
void
ADC_PowerDown(void)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -