//============================================================================
//文件名称：mqx_adc.c
//功能概要：ADC接口驱动源文件
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//更新记录：2013-05-20   V1.0     初始版本
//============================================================================

#include "mqx_adc.h"


static _mqx_int _io_adc_open(MQX_FILE_PTR, char_ptr, char_ptr);
static _mqx_int _io_adc_close(MQX_FILE_PTR);
static _mqx_int _io_adc_read (MQX_FILE_PTR, char_ptr, _mqx_int);
static _mqx_int _io_adc_write(MQX_FILE_PTR, char_ptr, _mqx_int);
static _mqx_int _io_adc_ioctl(MQX_FILE_PTR, _mqx_uint, pointer);

//===========================================================================
//函数名称：_io_adc_install
//参数说明：identifier：用于打开的设备名称(一个字符串)
//    adc_channel_ptr:通道信息
//函数返回：返回函数执行结果
//功能概要：该函数注册adc驱动
//===========================================================================
extern _mqx_uint _io_adc_install
   (
      char_ptr            identifier,
      ADC_CHANNEL_PTR adc_channel_ptr
   ) 
   
{
   _mqx_uint result;
   
   result = _io_dev_install(identifier,
      _io_adc_open,
      _io_adc_close,
      _io_adc_read,
      _io_adc_write,
      _io_adc_ioctl,
      adc_channel_ptr); 

      return result;

} 

//===========================================================================
//函数名称：_io_adc_open
//参数说明：fd_ptr：将要打开的设备文件句柄
//    open_name_ptr:该设备的名称的剩余部分
//    flags:在操作过程中使用的标志
//函数返回：返回函数执行结果
//功能概要：该函数打开ADC设备
//===========================================================================
_mqx_int _io_adc_open
   (
      MQX_FILE_PTR fd_ptr,
      char_ptr   open_name_ptr,
      char_ptr    flags
   )
{ 
	//printf("[_io_adc_open]: open adc device.\n");
	
   return(MQX_OK);
} 

//===========================================================================
//函数名称：_io_adc_close
//参数说明：fd_ptr：将要关闭的设备文件句柄
//函数返回：MQX-OK
//功能概要：该函数关闭ADC设备资源
//===========================================================================
_mqx_int _io_adc_close
   (
      MQX_FILE_PTR fd_ptr
   )
{ 

	//printf("[_io_adc_close]: close adc device.\n");
	
   return(MQX_OK);

} 

//===========================================================================
//函数名称：_io_adc_read
//参数说明：fd_ptr：设备的文件句柄
//    data_ptr:存取读取的字符
//    num:字符个数
//函数返回：0
//功能概要：该函数从ADC设备读取数据
//===========================================================================
_mqx_int _io_adc_read
   (
      MQX_FILE_PTR fd_ptr,
      char_ptr   data_ptr,
      _mqx_int   num
   )
{ 
	
	//printf("[_io_adc_read]: read adc device.\n");
   return(0);
} 

//===========================================================================
//函数名称：_io_adc_write
//参数说明：fd_ptr：设备的文件句柄
//    data_ptr:存取字符
//    num:字符个数
//函数返回：返回写入的字节个数
//功能概要：该函数从ADC设备读取数据
//===========================================================================
_mqx_int _io_adc_write
   (
      MQX_FILE_PTR fd_ptr,
      char_ptr   data_ptr,
      _mqx_int   num
   )
{ 
	
	//printf("[_io_adc_write]: write adc device.\n");
   return(num);
} 

//===========================================================================
//函数名称：_io_adc_ioctl
//参数说明：fd_ptr：设备的文件句柄
//    cmd:控制命令
//    num:控制参数
//函数返回：返回写入的字节个数
//功能概要：该函数控制ADC设备的操作
//===========================================================================

_mqx_int _io_adc_ioctl
   (
      MQX_FILE_PTR fd_ptr,
      _mqx_uint  cmd,
      pointer    param_ptr
   )
{ 
	ADC_CHANNEL_PTR channel_ptr = (ADC_CHANNEL_PTR)(param_ptr);
	uint_8 modulenumber  = channel_ptr->MODULE;
	uint_8 modulechannel   = channel_ptr->CHANNEL;
	uint_8 accuracy   = channel_ptr->ACCURACY;
	uint_8 times   = channel_ptr->SAMPLETIMES;
	uint_16 result;
	
	switch (cmd)
	{
	case MADC_IOCTL_SAMPLE_ONCE:
		adc_init(modulenumber);
		result = adc_once(modulenumber,modulechannel,accuracy);
		return result;
		
	case MADC_IOCTL_FILTER_MID:
		adc_init(modulenumber);
		result = adc_mid(modulenumber,modulechannel,accuracy);
		return result;
		
	case MADC_IOCTL_FILTER_AVE:
		adc_init(modulenumber);
		result = adc_ave(modulenumber,modulechannel,accuracy,times);
		return result;
		
	default:
	    break;
	}
	
     return IO_ERROR_INVALID_IOCTL_CMD;
} 

