virtual_audio_dri.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. * Copyright (c) 2020 Actions Semiconductor Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief virtual audio implementation
  9. */
  10. /*
  11. * Features
  12. */
  13. #include <kernel.h>
  14. #include <device.h>
  15. #include <string.h>
  16. #include <errno.h>
  17. #include <soc.h>
  18. #include <board_cfg.h>
  19. #include "../phy_audio_common.h"
  20. #include "../audio_acts_utils.h"
  21. #include <drivers/audio/audio_in.h>
  22. #include <fs/fs.h>
  23. #include <logging/log.h>
  24. LOG_MODULE_REGISTER(virtual_audio, CONFIG_LOG_DEFAULT_LEVEL);
  25. #define FIEE_PATH "/NAND:/fs_rw_test_file"
  26. struct fs_file_t fs_rw_test_file;
  27. static int fs_rw_test()
  28. {
  29. char read_data[8];
  30. int i;
  31. int err;
  32. off_t offset = -1;
  33. fs_file_t_init(&fs_rw_test_file);
  34. err = fs_open(&fs_rw_test_file, FIEE_PATH, FS_O_CREATE | FS_O_RDWR);
  35. if (err) {
  36. LOG_ERR("Failed to open %s (%d)", FIEE_PATH, err);
  37. return -ENOEXEC;
  38. }
  39. if (offset < 0) {
  40. err = fs_seek(&fs_rw_test_file, 0, FS_SEEK_END);
  41. } else {
  42. err = fs_seek(&fs_rw_test_file, offset, FS_SEEK_SET);
  43. }
  44. if (err) {
  45. LOG_ERR("Failed to seek %s (%d)", FIEE_PATH, err);
  46. fs_close(&fs_rw_test_file);
  47. return -ENOEXEC;
  48. }
  49. char fs_rw_test_data[] = "this test write fs";
  50. for(i=0;i<8;i++)
  51. {
  52. err=fs_write(&fs_rw_test_file, fs_rw_test_data, 8);
  53. LOG_ERR("fs_write:%0X",err);
  54. }
  55. fs_close(&fs_rw_test_file);
  56. fs_open(&fs_rw_test_file, FIEE_PATH, FS_O_CREATE | FS_O_RDWR);
  57. err=fs_read(&fs_rw_test_file,read_data,6);
  58. LOG_ERR("fs_read:%0X",err);
  59. for(i=0;i<8;i++)
  60. LOG_ERR("read_data:%c",read_data[i]);
  61. fs_close(&fs_rw_test_file);
  62. return 0;
  63. }
  64. /**
  65. * struct phy_dac_drv_data
  66. * @brief The software related data that used by physical dac driver.
  67. */
  68. struct virtual_audio_drv_data {
  69. uint32_t sdm_cnt; /* SDM samples counter */
  70. uint32_t sdm_cnt_timestamp; /* Record the timestamp of SDM counter by overflow irq */
  71. uint8_t sample_rate; /* The sample rate setting refer to enum audio_sr_sel_e */
  72. uint8_t lr_sel; /* left and right channel selection to enable, refer to enum a_lr_chl_e */
  73. uint8_t layout; /* DAC hardware layout */
  74. #ifdef CONFIG_CFG_DRV
  75. struct phy_dac_external_config external_config; /* DAC external configuration */
  76. #endif
  77. atomic_t refcount; /* DAC resources reference counter */
  78. uint8_t ch_fifo0_start : 1; /* The fifo0 channel start indicator */
  79. uint8_t ch_fifo1_start : 1; /* The fifo1 channel start indicator */
  80. uint8_t vol_set_mute : 1; /* The flag of the volume setting less than #VOL_MUTE_MIN_DB event*/
  81. uint8_t is_anc_enable : 1; /* If 1 to indicate that ANC has enabled */
  82. uint8_t audio_pll_index : 1; /* The index of audio pll */
  83. };
  84. struct device_info {
  85. struct k_work work;
  86. char name[16];
  87. uint8_t *buf;
  88. int buf_size;
  89. } user_device;
  90. char device_data[]="this is data";
  91. static void work_run_fun(struct k_work *item)
  92. {
  93. struct device_info *the_device =
  94. CONTAINER_OF(item, struct device_info, work);
  95. LOG_ERR("work_run_fun;%s,th_device->size:%d", the_device->name,the_device->buf_size);
  96. LOG_ERR("the_device->buf:%s",the_device->buf);
  97. }
  98. /**
  99. * struct phy_dac_config_data
  100. * @brief The hardware related data that used by physical dac driver.
  101. */
  102. struct virtual_audio_config_data {
  103. uint32_t reg_base; /* DAC controller register base address */
  104. struct audio_dma_dt dma_fifo0; /* DMA resource for FIFO0 */
  105. struct audio_dma_dt dma_fifo1; /* DMA resource for FIFO1 */
  106. uint8_t clk_id; /* DAC devclk id */
  107. uint8_t rst_id; /* DAC reset id */
  108. void (*irq_config)(void); /* IRQ configuration function */
  109. };
  110. static void virtual_audio_irq_config(void)
  111. {
  112. // /* Connect and enable DAC digital IRQ */
  113. // IRQ_CONNECT(IRQ_ID_DAC, CONFIG_AUDIO_DAC_0_IRQ_PRI,
  114. // phy_dac_digital_isr,
  115. // DEVICE_GET(dac0), 0);
  116. // irq_enable(IRQ_ID_DAC);
  117. // /* Connect and enable DAC FIFO IRQ */
  118. // IRQ_CONNECT(IRQ_ID_DACFIFO, CONFIG_AUDIO_DAC_0_IRQ_PRI,
  119. // phy_dac_fifo_isr,
  120. // DEVICE_GET(dac0), 0);
  121. // irq_enable(IRQ_ID_DACFIFO);
  122. }
  123. /* virtual_audio driver data */
  124. static struct virtual_audio_drv_data virtual_audio_drv_data0;
  125. /* physical dac config data */
  126. static const struct virtual_audio_config_data virtual_audio_config_data0 = {
  127. .reg_base = AUDIO_DAC_REG_BASE,
  128. AUDIO_DMA_FIFO_DEF(DAC, 0),
  129. AUDIO_DMA_FIFO_DEF(DAC, 1),
  130. .clk_id = 1,
  131. .rst_id = 1,
  132. .irq_config = virtual_audio_irq_config,
  133. };
  134. static int virtual_audio_enable(struct device *dev, void *param)
  135. {
  136. printk("virtual_audio_enable\n");
  137. /* tese work only */
  138. k_work_submit(&user_device.work);
  139. return 0;
  140. }
  141. static int virtual_audio_disable(struct device *dev, void *param)
  142. {
  143. printk("virtual_audio_disable\n");
  144. return 0;
  145. }
  146. static int virtual_audioioctl(struct device *dev, uint32_t cmd, void *param)
  147. {
  148. printk("virtual_audioioctl,cmd:%d,param:%p\n",cmd,param);
  149. return 0;
  150. }
  151. const struct virtual_audio_drv_api virtual_audio_drv_api = {
  152. .virtual_audio_enable = virtual_audio_enable,
  153. .virtual_audio_disable = virtual_audio_disable,
  154. .virtual_audio_ioctl = virtual_audioioctl
  155. };
  156. /* virtual_audio_out_init initialization */
  157. static int virtual_audio_out_init(const struct device *dev)
  158. {
  159. virtual_audio_drv_data0.audio_pll_index=1;
  160. printk("virtual_audio_out init successfully\n");
  161. /* initialize work for tese work only */
  162. strcpy(user_device.name, "user_dev");
  163. user_device.buf = device_data;
  164. user_device.buf_size = 2;
  165. /* initialize work item for printing device's error messages */
  166. k_work_init(&user_device.work,work_run_fun);
  167. return 0;
  168. }
  169. /* @brief command to creat Actions virtual_audio commands */
  170. static int virtual_audio_start(const struct shell *shell,
  171. size_t argc, char **argv)
  172. {
  173. struct device *dev;
  174. dev = (struct device *)device_get_binding("virtual_audio_out");
  175. virtual_audio_enable_io(dev,"virtuel_en");
  176. virtual_audio_disable_io(dev,"virtuel_disa");
  177. virtual_audio_ioctl_io(dev, 2, "virtuel_io");
  178. return 0;
  179. }
  180. DEVICE_DEFINE(virtual_audio, "virtual_audio_out", virtual_audio_out_init, NULL,
  181. &virtual_audio_drv_data0, &virtual_audio_config_data0,
  182. POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_OBJECTS, &virtual_audio_drv_api);
  183. SHELL_STATIC_SUBCMD_SET_CREATE(sub_virtual_fs_rw,
  184. SHELL_CMD(virtual_fs_rw, NULL, "virtual_fs_rw test.", fs_rw_test),
  185. SHELL_CMD(virtual_audio, NULL, "Actions virtual_audio commands.", virtual_audio_start));
  186. SHELL_CMD_REGISTER(shell_virtual_test, &sub_virtual_fs_rw, "shell_virtual_test commands", NULL);