123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /*
- * Copyright (c) 2006-2022, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2022-07-28 rtthread qiu first version
- */
- #include "drv_dac.h"
- #include "drv_common.h"
- #include <rtthread.h>
- #if defined(BSP_USING_DAC1) || defined(BSP_USING_DAC2)
- #define LOG_TAG "drv.dac"
- #include <drv_log.h>
- struct cyp_dac
- {
- cy_stc_csdidac_config_t cyhal_dac_device;
- struct rt_dac_device cyp_dac_device;
- char *name;
- };
- static struct cyp_dac dac_config[] =
- {
- #ifdef BSP_USING_DAC1
- DAC1_CONFIG,
- #endif
- #ifdef BSP_USING_DAC2
- DAC2_CONFIG,
- #endif
- };
- /*get dac channel*/
- static rt_uint32_t cyp_dac_get_channel(rt_uint32_t channel)
- {
- rt_uint32_t cyp_dac_channel = 0;
- switch (channel)
- {
- case 1:
- cyp_dac_channel = CY_CSDIDAC_A;
- break;
- case 2:
- cyp_dac_channel = CY_CSDIDAC_B;
- break;
- default:
- RT_ASSERT(0);
- break;
- }
- return cyp_dac_channel;
- }
- struct cyp_dac cyp_adc_obj[sizeof(dac_config) / sizeof(dac_config[0])];
- cy_stc_csdidac_context_t csdidac_context;
- /*dac device enable*/
- static rt_err_t cyp_dac_enabled(struct rt_dac_device *device, rt_uint32_t channel)
- {
- cy_rslt_t result;
- rt_uint32_t cyp_channel;
- RT_ASSERT(device != RT_NULL);
- cyhal_dac_t *dac_device;
- dac_device = device->parent.user_data;
- /* get current dac channel*/
- cyp_channel = cyp_dac_get_channel(channel);
- /*DAC device init*/
- result = Cy_CSDIDAC_Init(&CSDIDAC_csdidac_config, &csdidac_context);
- if (result != RT_EOK)
- {
- LOG_E("Cy_CSDIDAC_Init fail = %d\n", result);
- return -RT_ENOSYS;
- }
- return RT_EOK;
- }
- /*dac device disable*/
- static rt_err_t cyp_dac_disable(struct rt_dac_device *device, rt_uint32_t channel)
- {
- rt_uint32_t cyp_channel;
- cy_rslt_t result;
- RT_ASSERT(device != RT_NULL);
- cyhal_dac_t *dac_device;
- dac_device = device->parent.user_data;
- cyp_channel = cyp_dac_get_channel(channel);
- /*DAC free device*/
- result = Cy_CSDIDAC_OutputDisable(cyp_channel, &csdidac_context);
- if (result != RT_EOK)
- {
- LOG_E("DAC Outputdisable failed. Error: %d\n", result);
- return -RT_ENOSYS;
- }
- return RT_EOK;
- }
- /*set dac output value*/
- static rt_err_t cyp_adc_convert(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value)
- {
- RT_ASSERT(device != RT_NULL);
- cy_rslt_t result;
- rt_uint32_t cyp_channel;
- cyp_channel = cyp_dac_get_channel(channel);
- result = Cy_CSDIDAC_OutputEnable(cyp_channel, *value, &csdidac_context);
- if (result != RT_EOK)
- {
- LOG_E("DAC channel initialization failed. Error: %d\n", result);
- return -RT_ENOSYS;
- }
- return RT_EOK;
- }
- static const struct rt_dac_ops cyp_dac_ops =
- {
- .disabled = cyp_dac_disable,
- .enabled = cyp_dac_enabled,
- .convert = cyp_adc_convert,
- };
- /*dac device init*/
- static int rt_hw_dac_init(void)
- {
- int result = RT_EOK;
- /* save dac name */
- char name_buf[5] = {'d', 'a', 'c', '0', 0};
- int i = 0;
- i = sizeof(dac_config) / sizeof(dac_config[0]);
- for (i = 0; i < sizeof(dac_config) / sizeof(dac_config[0]); i++)
- {
- #ifdef BSP_USING_DAC1
- name_buf[3] = '1';
- #endif
- #ifdef BSP_USING_DAC2
- name_buf[3] = '2';
- #endif
- /* register DAC device */
- if (rt_hw_dac_register(&cyp_adc_obj[i].cyp_dac_device, name_buf, &cyp_dac_ops, RT_NULL) == RT_EOK)
- {
- LOG_E("dac device register success\n");
- }
- else
- {
- LOG_E("dac device register fail\n");
- result = -RT_ERROR;
- }
- }
- return result;
- }
- INIT_BOARD_EXPORT(rt_hw_dac_init);
- #endif /* BSP_USING_DAC1 /BSP_USING_DAC2 */
|