海思接tlv320aicX140音频驱动

// SPDX-License-Identifier: GPL-2.0
// TLV320ADCX140 Sound driver
// Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com/

#ifndef _TLV320ADCX140_H
#define _TLV320ADCX140_H

#define ADCX140_RATES	(SNDRV_PCM_RATE_44100 | \
			 SNDRV_PCM_RATE_48000 | \
			 SNDRV_PCM_RATE_96000 | \
			 SNDRV_PCM_RATE_192000)

#define ADCX140_FORMATS	(SNDRV_PCM_FMTBIT_S16_LE | \
			 SNDRV_PCM_FMTBIT_S20_3LE | \
			 SNDRV_PCM_FMTBIT_S24_3LE | \
			 SNDRV_PCM_FMTBIT_S24_LE | \
			 SNDRV_PCM_FMTBIT_S32_LE)

#define ADCX140_PAGE_SELECT	0x00
#define ADCX140_SW_RESET	0x01
#define ADCX140_SLEEP_CFG 	0x02
#define ADCX140_SHDN_CFG	0x05
#define ADCX140_ASI_CFG0	0x07
#define ADCX140_ASI_CFG1	0x08
#define ADCX140_ASI_CFG2	0x09
#define ADCX140_ASI_CH1		0x0b
#define ADCX140_ASI_CH2		0x0c
#define ADCX140_ASI_CH3		0x0d
#define ADCX140_ASI_CH4		0x0e
#define ADCX140_ASI_CH5		0x0f
#define ADCX140_ASI_CH6		0x10
#define ADCX140_ASI_CH7		0x11
#define ADCX140_ASI_CH8		0x12
#define ADCX140_MST_CFG0	0x13
#define ADCX140_MST_CFG1	0x14
#define ADCX140_ASI_STS		0x15
#define ADCX140_CLK_SRC		0x16
#define ADCX140_PDMCLK_CFG	0x1f
#define ADCX140_PDM_CFG		0x20
#define ADCX140_GPIO_CFG0	0x21
#define ADCX140_GPO_CFG0	0x22
#define ADCX140_GPO_CFG1	0x23
#define ADCX140_GPO_CFG2	0x24
#define ADCX140_GPO_CFG3	0x25
#define ADCX140_GPO_VAL		0x29
#define ADCX140_GPIO_MON	0x2a
#define ADCX140_GPI_CFG0	0x2b
#define ADCX140_GPI_CFG1	0x2c
#define ADCX140_GPI_MON		0x2f
#define ADCX140_INT_CFG		0x32
#define ADCX140_INT_MASK0	0x33
#define ADCX140_INT_LTCH0	0x36
#define ADCX140_BIAS_CFG	0x3b
#define ADCX140_CH1_CFG0	0x3c
#define ADCX140_CH1_CFG1	0x3d
#define ADCX140_CH1_CFG2	0x3e
#define ADCX140_CH1_CFG3	0x3f
#define ADCX140_CH1_CFG4	0x40
#define ADCX140_CH2_CFG0	0x41
#define ADCX140_CH2_CFG1	0x42
#define ADCX140_CH2_CFG2	0x43
#define ADCX140_CH2_CFG3	0x44
#define ADCX140_CH2_CFG4	0x45
#define ADCX140_CH3_CFG0	0x46
#define ADCX140_CH3_CFG1	0x47
#define ADCX140_CH3_CFG2	0x48
#define ADCX140_CH3_CFG3	0x49
#define ADCX140_CH3_CFG4 	0x4a
#define ADCX140_CH4_CFG0	0x4b
#define ADCX140_CH4_CFG1	0x4c
#define ADCX140_CH4_CFG2	0x4d
#define ADCX140_CH4_CFG3	0x4e
#define ADCX140_CH4_CFG4	0x4f
#define ADCX140_CH5_CFG2	0x52
#define ADCX140_CH5_CFG3	0x53
#define ADCX140_CH5_CFG4	0x54
#define ADCX140_CH6_CFG2	0x57
#define ADCX140_CH6_CFG3	0x58
#define ADCX140_CH6_CFG4	0x59
#define ADCX140_CH7_CFG2	0x5c
#define ADCX140_CH7_CFG3	0x5d
#define ADCX140_CH7_CFG4	0x5e
#define ADCX140_CH8_CFG2	0x61
#define ADCX140_CH8_CFG3	0x62
#define ADCX140_CH8_CFG4	0x63
#define ADCX140_DSP_CFG0	0x6b
#define ADCX140_DSP_CFG1	0x6c
#define ADCX140_DRE_CFG0	0x6d
#define ADCX140_AGC_CFG0	0x70
#define ADCX140_IN_CH_EN	0x73
#define ADCX140_ASI_OUT_CH_EN	0x74
#define ADCX140_PWR_CFG		0x75
#define ADCX140_DEV_STS0	0x76
#define ADCX140_DEV_STS1	0x77
#define ADCX140_PHASE_CALIB		0X7b

#define ADCX140_RESET	BIT(0)

#define ADCX140_WAKE_DEV	BIT(0)
#define ADCX140_AREG_INTERNAL	BIT(7)

#define ADCX140_BCLKINV_BIT	BIT(2)
#define ADCX140_FSYNCINV_BIT	BIT(3)
#define ADCX140_INV_MSK		(ADCX140_BCLKINV_BIT | ADCX140_FSYNCINV_BIT)
#define ADCX140_BCLK_FSYNC_MASTER	BIT(7)
#define ADCX140_I2S_MODE_BIT	BIT(6)
#define ADCX140_LEFT_JUST_BIT	BIT(7)
#define ADCX140_ASI_FORMAT_MSK	(ADCX140_I2S_MODE_BIT | ADCX140_LEFT_JUST_BIT)

#define ADCX140_16_BIT_WORD	0x0
#define ADCX140_20_BIT_WORD	BIT(4)
#define ADCX140_24_BIT_WORD	BIT(5)
#define ADCX140_32_BIT_WORD	(BIT(4) | BIT(5))
#define ADCX140_WORD_LEN_MSK	0x30

#define ADCX140_MAX_CHANNELS	8

#define ADCX140_MIC_BIAS_VAL_VREF	0
#define ADCX140_MIC_BIAS_VAL_VREF_1096	1
#define ADCX140_MIC_BIAS_VAL_AVDD	6
#define ADCX140_MIC_BIAS_VAL_MSK GENMASK(6, 4)
#define ADCX140_MIC_BIAS_SHIFT		4

#define ADCX140_MIC_BIAS_VREF_275V	0
#define ADCX140_MIC_BIAS_VREF_25V	1
#define ADCX140_MIC_BIAS_VREF_1375V	2
#define ADCX140_MIC_BIAS_VREF_MSK GENMASK(1, 0)

#define ADCX140_PWR_CTRL_MSK    GENMASK(7, 5)
#define ADCX140_PWR_CFG_BIAS_PDZ	BIT(7)
#define ADCX140_PWR_CFG_ADC_PDZ		BIT(6)
#define ADCX140_PWR_CFG_PLL_PDZ		BIT(5)

#define ADCX140_TX_OFFSET_MASK		GENMASK(4, 0)

#define ADCX140_NUM_PDM_EDGES		4
#define ADCX140_PDM_EDGE_SHIFT		7

#define ADCX140_NUM_GPI_PINS		4
#define ADCX140_GPI_SHIFT		4
#define ADCX140_GPI1_INDEX		0
#define ADCX140_GPI2_INDEX		1
#define ADCX140_GPI3_INDEX		2
#define ADCX140_GPI4_INDEX		3

#define ADCX140_NUM_GPOS		4
#define ADCX140_NUM_GPO_CFGS		2
#define ADCX140_GPO_SHIFT		4
#define ADCX140_GPO_CFG_MAX		4
#define ADCX140_GPO_DRV_MAX		5

#define ADCX140_TX_FILL    BIT(0)

#define ADCX140_NUM_GPIO_CFGS		2
#define ADCX140_GPIO_SHIFT		4
#define ADCX140_GPIO_CFG_MAX		15
#define ADCX140_GPIO_DRV_MAX		5

#endif /* _TLV320ADCX140_ */
#include "tlv320adcx140.h"
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>      // 最常用的头文件,包含文件控制选项
int i2c_read(unsigned int i2c_num, unsigned int dev_addr, unsigned int reg_addr,
             unsigned int reg_addr_end, unsigned int reg_width,
             unsigned int data_width, unsigned int reg_step)
{
    int retval = 0;
    int fd = -1;
    char file_name[0x10];
    unsigned char buf[4];
    int cur_addr;
    static struct i2c_rdwr_ioctl_data rdwr;
    static struct i2c_msg msg[2];
    unsigned int data;
    memset(buf, 0x0, 4);
    printf("i2c_num:0x%x, dev_addr:0x%x; reg_addr:0x%x; reg_addr_end:0x%x; reg_width:% d;data_width : % d. \n\n ",i2c_num,
    dev_addr << 1, reg_addr, reg_addr_end, reg_width, data_width);
    sprintf(file_name, "/dev/i2c-%u", i2c_num);
    fd = open(file_name, O_RDWR);
    if (fd < 0)
    {
        printf("Open %s error!\n", file_name);
        return -1;
    }
    retval = ioctl(fd, I2C_SLAVE_FORCE, dev_addr);
    if (retval < 0)
    {
        printf("CMD_SET_I2C_SLAVE error!\n");
        retval = -1;
        goto end;
    }
    msg[0].addr = dev_addr;
    msg[0].flags = 0;
    msg[0].len = reg_width;
    msg[0].buf = buf;
    msg[1].addr = dev_addr;
    msg[1].flags = 0;
    msg[1].flags |= I2C_M_RD;
    msg[1].len = data_width;
    msg[1].buf = buf;
    rdwr.msgs = &msg[0];
    rdwr.nmsgs = (__u32)2;
    for (cur_addr = reg_addr; cur_addr <= reg_addr_end; cur_addr += reg_step)
    {
        if (reg_width == 2)
        {
            buf[0] = (cur_addr >> 8) & 0xff;
            buf[1] = cur_addr & 0xff;
        }
        else
            buf[0] = cur_addr & 0xff;
        retval = ioctl(fd, I2C_RDWR, &rdwr);
        if (retval != 2)
        {
            printf("CMD_I2C_READ error!\n");
            retval = -1;
            goto end;
        }
        if (data_width == 2)
        {
            data = buf[1] | (buf[0] << 8);
        }
        else
            data = buf[0];
        printf("0x%x: 0x%x\n", cur_addr, data);
    }
    retval = 0;
end:
    close(fd);
    return retval;
}
int i2c_write(unsigned int i2c_num, unsigned int dev_addr,
              unsigned int reg_addr, unsigned int data,
              unsigned int reg_width, unsigned int data_width)
{
    int retval = 0;
    int fd = -1;
    int index = 0;
    char file_name[0x10];
    unsigned char buf[4];
    printf("i2c_num:0x%x, dev_addr:0x%x; reg_addr:0x%x; data:0x%x; reg_width: %d;data_width : %d.\n ",i2c_num,
           dev_addr << 1, reg_addr, data, reg_width, data_width);
    sprintf(file_name, "/dev/i2c-%u", i2c_num);
    fd = open(file_name, O_RDWR);
    if (fd < 0)
    {
        printf("Open %s error!\n", file_name);
        return -1;
    }
    retval = ioctl(fd, I2C_SLAVE_FORCE, dev_addr);
    if (retval < 0)
    {
        printf("set i2c device address error!\n");
        retval = -1;
        goto end;
    }
    if (reg_width == 2)
    {
        buf[index] = (reg_addr >> 8) & 0xff;
        index++;
        buf[index] = reg_addr & 0xff;
        index++;
    }
    else
    {
        buf[index] = reg_addr & 0xff;
        index++;
    }
    if (data_width == 2)
    {
        buf[index] = (data >> 8) & 0xff;
        index++;
        buf[index] = data & 0xff;
        index++;
    }
    else
    {
        buf[index] = data & 0xff;
        index++;
    }
    retval = write(fd, buf, (reg_width + data_width));
    if (retval < 0)
    {
        printf("i2c write error!\n");
        retval = -1;
        goto end;
    }
    retval = 0;
end:
    close(fd);
    return retval;
}
int I2C_Write(char deviceAddr, char regAddr,char value)
{
    return i2c_write(0,deviceAddr,regAddr,value,1,1);
}
int main()
{

    I2C_Write(0x4c, ADCX140_SW_RESET, 0x01);    /* Reset */
    I2C_Write(0x4c, ADCX140_PAGE_SELECT, 0x00); /* page 0 */
    I2C_Write(0x4c, ADCX140_SLEEP_CFG, 0x81);   /* Debice is not sleep mode */
    I2C_Write(0x4c, ADCX140_SHDN_CFG, 0x05);    /* */
    I2C_Write(0x4c, ADCX140_ASI_CFG0, 0x40);    /* I2S mode ,24bit*/


    I2C_Write(0x4c, ADCX140_ASI_CH1, 0x00);  /* I2S mode选择叠加到slot0*/
    I2C_Write(0x4c, ADCX140_CH1_CFG0, 0x04); /* Analog single-ended input for channel 1 */
    I2C_Write(0x4c, ADCX140_CH1_CFG1, 0x28); /* input 40dB,step 1dB*/
    I2C_Write(0x4c, ADCX140_CH1_CFG2, 0xff); /* output 27dB, setp -0.5dB*/

    I2C_Write(0x4c, ADCX140_ASI_CH2, 0x01);  /* I2Smode 叠加到slot1*/
    I2C_Write(0x4c, ADCX140_CH2_CFG0, 0x04); /* channel2 */
    I2C_Write(0x4c, ADCX140_CH2_CFG1, 0x28);
    I2C_Write(0x4c, ADCX140_CH2_CFG2, 0xff);

    I2C_Write(0x4c, ADCX140_ASI_CH3, 0x02);  /* I2Smode 叠加到slot2*/
    I2C_Write(0x4c, ADCX140_CH3_CFG0, 0x04); /* channel3 */
    I2C_Write(0x4c, ADCX140_CH3_CFG1, 0x28);
    I2C_Write(0x4c, ADCX140_CH3_CFG2, 0xff);

    I2C_Write(0x4c, ADCX140_ASI_CH4, 0x03);  /* I2Smode 叠加到slot3*/
    I2C_Write(0x4c, ADCX140_CH4_CFG0, 0x04); /* channel3 */
    I2C_Write(0x4c, ADCX140_CH4_CFG1, 0x28);
    I2C_Write(0x4c, ADCX140_CH4_CFG2, 0xff);

    I2C_Write(0x4c, ADCX140_IN_CH_EN, 0xf0);      /* channel1 、channel2 channel3 input en */
    I2C_Write(0x4c, ADCX140_ASI_OUT_CH_EN, 0xf0); /* channel1 、channel2 channel3 output en */

    I2C_Write(0x4c, ADCX140_PWR_CFG, 0xe0); /* power up PLL */
    I2C_Write(0x4c,ADCX140_CLK_SRC,0x10); /* */
    I2C_Write(0x4c,ADCX140_GPIO_CFG0,0x22); /* GPIO1 provide MCLK = 24.516MHz*/

    return 0;
}

海思需要配置为I2S master模式16bit*16通道的模式,只使用0、1、2、3通道采样率44.1K

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值