diff --git a/bsp/fm3/adc.c b/bsp/fm3/adc.c new file mode 100644 index 0000000000000000000000000000000000000000..d167c3d1eab27aa81edff91069187e0c00165432 --- /dev/null +++ b/bsp/fm3/adc.c @@ -0,0 +1,116 @@ +/* + * File : adc.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2011, RT-Thread Develop Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2011-03-03 lgnq + */ + +#include +#include +#include +#include +#include + +#include "mb9bf506r.h" +#include "adc.h" + +static struct rt_device adc; + +static rt_err_t rt_adc_init(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + + if(!(dev->flag & RT_DEVICE_FLAG_ACTIVATED)) + { + /* I/O setting AN08 - P18 */ + FM3_GPIO->ADE |= 0x100; + FM3_GPIO->PFR1 = 0x100; + + /* A/DC setting */ + FM3_ADC0->SCIS1 = 0x01; + FM3_ADC0->ADSS1 = 0x00; /* sampling timming ADST0 */ + FM3_ADC0->ADST1 = 0x43; + FM3_ADC0->ADCT = 0x02; + FM3_ADC0->SCCR = 0x10; /* FIFO clear,single mode */ + FM3_ADC0->CMPCR = 0x00; /* disable comparator */ + + /* starting A/DC */ + FM3_ADC0->SCCR |= 0x01; /* A/DC start */ + + dev->flag |= RT_DEVICE_FLAG_ACTIVATED; + } + + return RT_EOK; +} + +static rt_err_t rt_adc_control(rt_device_t dev, rt_uint8_t cmd, void *args) +{ + RT_ASSERT(dev != RT_NULL); + + switch (cmd) + { + case RT_DEVICE_CTRL_ADC_START: + FM3_ADC0->SCCR |= 0x1; + break; + + case RT_DEVICE_CTRL_ADC_RESULT: + while(FM3_ADC0->ADSR & 0x1) + ; + *((rt_uint16_t*)args) = FM3_ADC0->SCFD; + *((rt_uint16_t*)args) = *((rt_uint16_t*)args) >> 6; + *((rt_uint16_t*)args) = (*((rt_uint16_t*)args)*3300)/1024; + break; + } + + return RT_EOK; +} + +extern rt_thread_t info_tid; +rt_uint16_t adc_value; +static void adc_thread_entry(void *parameter) +{ + rt_device_t device; + struct rtgui_event_command ecmd; + + RTGUI_EVENT_COMMAND_INIT(&ecmd); + ecmd.type = RTGUI_CMD_USER_INT; + ecmd.command_id = ADC_UPDATE; + device = rt_device_find("adc"); + while(1) + { + rt_device_control(device, RT_DEVICE_CTRL_ADC_START, RT_NULL); + rt_device_control(device, RT_DEVICE_CTRL_ADC_RESULT, &adc_value); + rtgui_thread_send(info_tid, &ecmd.parent, sizeof(ecmd)); + rt_thread_delay(20); + } +} + +static rt_thread_t adc_thread; +void rt_hw_adc_init(void) +{ + adc.type = RT_Device_Class_Char; /* fixme: should be adc type */ + adc.rx_indicate = RT_NULL; + adc.tx_complete = RT_NULL; + adc.init = rt_adc_init; + adc.open = RT_NULL; + adc.close = RT_NULL; + adc.read = RT_NULL; + adc.write = RT_NULL; + adc.control = rt_adc_control; + adc.user_data = RT_NULL; + + adc_thread = rt_thread_create("adc", adc_thread_entry, RT_NULL, 384, 29, 5); + if(adc_thread != RT_NULL) + rt_thread_startup(adc_thread); + + /* register a character device */ + rt_device_register(&adc, "adc", RT_DEVICE_FLAG_RDWR); +} + diff --git a/bsp/fm3/adc.h b/bsp/fm3/adc.h new file mode 100644 index 0000000000000000000000000000000000000000..601a67619fb48de7350c8abba6e5a159f5090aab --- /dev/null +++ b/bsp/fm3/adc.h @@ -0,0 +1,32 @@ +/* + * File : adc.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2011, RT-Thread Develop Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2011-03-03 lgnq + */ + +#ifndef __ADC_H__ +#define __ADC_H__ + +/* Exported constants ---------------------------------------------------------*/ +/* Exported macro -------------------------------------------------------------*/ +#define ADC_MODE_SINGLE 0x00UL +#define ADC_MODE_SCAN 0x01UL +#define ADC_MODE_TAILGATE 0x02UL + +#define RT_DEVICE_CTRL_ADC_START 0xF1 /* start ADC conversion */ +#define RT_DEVICE_CTRL_ADC_RESULT 0xF2 /* get ADC result */ + +#define ADC_UPDATE 0 + +/* Exported functions --------------------------------------------------------- */ +void rt_hw_adc_init(void); + +#endif /*__ADC_H__ */