233 lines
6.4 KiB
C
233 lines
6.4 KiB
C
/*
|
|
* This file is part of FH8620 BSP for RT-Thread distribution.
|
|
*
|
|
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
|
* All rights reserved
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Visit http://www.fullhan.com to get contact with Fullhan.
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
*/
|
|
|
|
#ifndef ACW_H_
|
|
#define ACW_H_
|
|
#include <rtthread.h>
|
|
#include <rtdevice.h>
|
|
#ifdef RT_USING_DFS
|
|
#include <dfs_fs.h>
|
|
#endif
|
|
#include <rthw.h>
|
|
#define ACW_CAP_DMA_CHAN 2
|
|
#define ACW_PLY_DMA_CHAN 3
|
|
typedef unsigned long long dma_addr_t;
|
|
struct scatterlist {
|
|
#ifdef CONFIG_DEBUG_SG
|
|
unsigned long sg_magic;
|
|
#endif
|
|
unsigned long page_link;
|
|
unsigned int offset;
|
|
unsigned int length;
|
|
dma_addr_t dma_address;
|
|
#ifdef CONFIG_NEED_SG_DMA_LENGTH
|
|
unsigned int dma_length;
|
|
#endif
|
|
};
|
|
#define readl(a) (*(volatile rt_uint32_t *)(a))
|
|
#define rkqueue_struct rt_workqueue
|
|
#define work_struct rt_work
|
|
#define INIT_WORK(work,func) rt_work_init(work,func,RT_NULL);
|
|
#define queue_work rt_workqueue_dowork
|
|
|
|
|
|
//timer
|
|
#define timer_list rt_timer
|
|
#define wait_queue_head_t struct rt_event
|
|
#define init_waitqueue_head(event_t) rt_event_init(event_t, "audio_event", RT_IPC_FLAG_FIFO)
|
|
typedef enum{
|
|
AC_SR_8K = 8000,
|
|
AC_SR_16K = 16000,
|
|
AC_SR_32K = 32000,
|
|
AC_SR_441K = 44100,
|
|
AC_SR_48K = 48000,
|
|
} FH_AC_SAMPLE_RATE_E;
|
|
|
|
typedef enum{
|
|
AC_BW_8 = 8,
|
|
AC_BW_16 = 16,
|
|
AC_BW_24 = 24,
|
|
} FH_AC_BIT_WIDTH_E;
|
|
|
|
enum io_select{
|
|
mic_in = 0,
|
|
line_in = 1,
|
|
speaker_out = 2,
|
|
line_out = 3,
|
|
};
|
|
|
|
struct fh_audio_cfg_arg{
|
|
enum io_select io_type;
|
|
int volume;
|
|
int rate;
|
|
int frame_bit;
|
|
int channels;
|
|
int buffer_size;
|
|
int period_size;
|
|
};
|
|
typedef struct{
|
|
unsigned int len;
|
|
unsigned char *data;
|
|
}FH_AC_FRAME_S;
|
|
|
|
typedef enum{
|
|
FH_AC_MIC_IN = 0,
|
|
FH_AC_LINE_IN = 1,
|
|
FH_AC_SPK_OUT = 2,
|
|
FH_AC_LINE_OUT = 3
|
|
}FH_AC_IO_TYPE_E;
|
|
|
|
|
|
typedef struct {
|
|
FH_AC_IO_TYPE_E io_type;
|
|
FH_AC_SAMPLE_RATE_E sample_rate;
|
|
FH_AC_BIT_WIDTH_E bit_width;
|
|
unsigned int channels;
|
|
unsigned int period_size;
|
|
unsigned int volume;
|
|
} FH_AC_CONFIG;
|
|
|
|
struct device_dma_parameters {
|
|
/*
|
|
* a low level driver may set these to teach IOMMU code about
|
|
* sg limitations.
|
|
*/
|
|
unsigned int max_segment_size;
|
|
unsigned long segment_boundary_mask;
|
|
};
|
|
|
|
struct list_head {
|
|
struct list_head *next;
|
|
struct list_head *prev;
|
|
};
|
|
struct dma_coherent_mem {
|
|
void *virt_base;
|
|
dma_addr_t device_base;
|
|
int size;
|
|
int flags;
|
|
unsigned long *bitmap;
|
|
};
|
|
struct device_acw{
|
|
unsigned long long *dma_mask; /* dma mask (if dma'able device) */
|
|
unsigned long long coherent_dma_mask;/* Like dma_mask, but for
|
|
alloc_coherent mappings as
|
|
not all hardware supports
|
|
64 bit addresses for consistent
|
|
allocations such descriptors. */
|
|
struct device_dma_parameters *dma_parms;
|
|
|
|
struct list_head dma_pools;
|
|
|
|
struct dma_coherent_mem *dma_mem;
|
|
};
|
|
#define false 0
|
|
#define true 1
|
|
|
|
|
|
|
|
#define AC_INIT_CAPTURE_MEM 0x10
|
|
#define AC_INIT_PLAYBACK_MEM 0x11
|
|
|
|
|
|
#define AC_SET_VOL 0x12
|
|
#define AC_SET_INPUT_MODE 0x13
|
|
#define AC_SET_OUTPUT_MODE 0x14
|
|
|
|
|
|
#define AC_AI_EN 0x15
|
|
#define AC_AO_EN 0x16
|
|
#define AC_AI_DISABLE 0x17
|
|
#define AC_AO_DISABLE 0x18
|
|
#define AC_AI_PAUSE 0x19
|
|
#define AC_AI_RESUME 0x1a
|
|
#define AC_AO_PAUSE 0x1b
|
|
#define AC_AO_RESUME 0x1c
|
|
#define AC_MIC_BOOST 0x1d
|
|
|
|
#define POLLIN 0x001 /* There is data to read. */
|
|
#define POLLPRI 0x002 /* There is urgent data to read. */
|
|
#define POLLOUT 0x004 /* Writing now will not block. */
|
|
|
|
|
|
/* These values are defined in XPG4.2. */
|
|
# define POLLRDNORM 0x040 /* Normal data may be read. */
|
|
# define POLLRDBAND 0x080 /* Priority data may be read. */
|
|
# define POLLWRNORM 0x100 /* Writing now will not block. */
|
|
# define POLLWRBAND 0x200 /* Priority data may be written. */
|
|
|
|
|
|
|
|
/* These are extensions for Linux. */
|
|
# define POLLMSG 0x400
|
|
# define POLLREMOVE 0x1000
|
|
# define POLLRDHUP 0x2000
|
|
|
|
|
|
/* Event types always implicitly polled for. These bits need not be set in
|
|
`events', but they will appear in `revents' to indicate the status of
|
|
the file descriptor. */
|
|
#define POLLERR 0x008 /* Error condition. */
|
|
#define POLLHUP 0x010 /* Hung up. */
|
|
#define POLLNVAL 0x020 /* Invalid polling request. */
|
|
|
|
#define EPERM 1 /* Operation not permitted */
|
|
#define ENOENT 2 /* No such file or directory */
|
|
#define ESRCH 3 /* No such process */
|
|
#define EINTR 4 /* Interrupted system call */
|
|
#define EIO 5 /* I/O error */
|
|
#define ENXIO 6 /* No such device or address */
|
|
#define E2BIG 7 /* Argument list too long */
|
|
#define ENOEXEC 8 /* Exec format error */
|
|
#define EBADF 9 /* Bad file number */
|
|
#define ECHILD 10 /* No child processes */
|
|
#define EAGAIN 11 /* Try again */
|
|
#define ENOMEM 12 /* Out of memory */
|
|
#define EACCES 13 /* Permission denied */
|
|
#define EFAULT 14 /* Bad address */
|
|
#define ENOTBLK 15 /* Block device required */
|
|
#define EBUSY 16 /* Device or resource busy */
|
|
#define EEXIST 17 /* File exists */
|
|
#define EXDEV 18 /* Cross-device link */
|
|
#define ENODEV 19 /* No such device */
|
|
#define ENOTDIR 20 /* Not a directory */
|
|
#define EISDIR 21 /* Is a directory */
|
|
#define EINVAL 22 /* Invalid argument */
|
|
#define ENFILE 23 /* File table overflow */
|
|
#define EMFILE 24 /* Too many open files */
|
|
#define ENOTTY 25 /* Not a typewriter */
|
|
#define ETXTBSY 26 /* Text file busy */
|
|
#define EFBIG 27 /* File too large */
|
|
#define ENOSPC 28 /* No space left on device */
|
|
#define ESPIPE 29 /* Illegal seek */
|
|
#define EROFS 30 /* Read-only file system */
|
|
#define EMLINK 31 /* Too many links */
|
|
#define EPIPE 32 /* Broken pipe */
|
|
#define EDOM 33 /* Math argument out of domain of func */
|
|
#define ERANGE 34 /* Math result not representable */
|
|
extern void fh_audio_init(void);
|
|
extern void fh_acw_test();
|
|
#endif
|