首页 > 编程知识 正文

linux总线驱动模型,rs232串口通信程序

时间:2023-05-05 11:53:22 阅读:165828 作者:1489

本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记

一. i2s驱动器的probe函数映射虚拟存储器,并且IIS寄存器的起始地址为0 x 55000000 s 3c 24 xx _ i2s.regs=io remap (s3c 2410 _ pa _ IIS,0x100 ) 获取iis时钟并启用iis时钟s3c 24xx _ i2s.iis _ clk=clk _ get (pdev-dev,“IIS”); CLK_enable(s3c24xx_I2s.IIS_clk ); 放置IIS管脚。 IIS有五个引脚:

I2SLRCK :表示当前听到的声音的声道,在I2SLRCK为低电平的情况下,传输“左声道”的数据,在I2SLRCK为高电平的情况下,传输“右声道”的数据。

I2SSCLK :使用串行位时钟、I2S传输数据

SCDCLK: 2440提供给解码芯片使用的系统时钟。

I2SSDI:I2S输入信号线

I2SSDO:I2S输出信号线# defines 3c 2410 _ gp E0 _ I2 SLR CK (0x 020 ) defineS3C2410_GPE1_I2ssclk )0x02 ) defines 3c 2410 _ GPP d fines 3c 2410 _ gp E3 configure the I2 spinsincorrectmode */) ) s3c 2410 _ gpio _ CFG pin (s3c 2410 _ gpe 1,S3C2410_GPE1_I2SSCLK ); s3c 2410 _ gpio _ CFG pin (s3c 2410 _ gpe 2,S3C2410_GPE2_CDCLK ); s3c 2410 _ gpio _ CFG pin (s3c 2410 _ gp E3,S3C2410_GPE3_I2SSDI ); s3c 2410 _ gpio _ CFG pin (s3c 2410 _ gp E4,S3C2410_GPE4_I2SSDO ); GPECON寄存器:

在I2S enable,IISCON寄存器的第0位中输入1 # defines 3c 2410 _ iiscon _ IIS en (10 ) writel(S3C2410_iiscon_IISen,s3c 24xx _ i2s )

控制I2S的收发停止,不进行收发。 s3c24xx_snd_txctrl(0; s3c24xx_snd_rxctrl(0; 二、I2S的发送控制开始发送I2S

IISCON寄存器、I2S启用、DMA发送请求enable、islrckactive # defines 3c 2410 _ iiscon _ txd maen (15 ) # defines 3c 2410 _ iscon _ iiid

允许写入IISFCON寄存器并发送缓存。 高速缓存模式是DMA模式

# defines 3c 2410 _ iisfcon _ txd ma (115 ) defineS3C2410_iisfcon_txenable ) 113 ) iisfcon|=s3c 2410 _ iisfcon _ tttatatttattattttion

写入IISMOD寄存器,选择I2S的发送模式。

# defines 3c 2410 _ IIS mod _ tx mode (26 ) iismod |=S3C2410_IISMOD_TXMODE;

停止发送I2S

停止I2S与I2S的发送控制大致相反,唯一的不同在于没有禁用I2S。 三. I2S接收控制启动I2S接收

IISCON寄存器、I2S使能、DMA接收请求enable、islrckactive # defines 3c 2410 _ iiscon _ rxd maen (14 ) # defines 3c 2410 _ iscon _ iiscon

写IISMOD寄存器,选择I2S的

接收模式。

#define S3C2410_IISMOD_RXMODE (1<<6)iismod |= S3C2410_IISMOD_RXMODE;

③写IISFCON寄存器,使能接收缓存,缓存模式为DMA模式

#define S3C2410_IISFCON_RXDMA (1<<14)#define S3C2410_IISFCON_RXENABLE (1<<12)iisfcon |= S3C2410_IISFCON_RXDMA | S3C2410_IISFCON_RXENABLE; 停止I2S的接收
跟启动的寄存器写相反的值。 四. I2S的模式设置 Master/slave模式设置, IISMOD寄存器的第8位设置
master模式:cpu向音频解码芯片提供时钟
slave模式:音频解码芯片提供时钟 iismod |= S3C2410_IISMOD_SLAVE;writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);

设置串行数据格式,IISMOD寄存器的第4位设置 "#define S3C2410_IISMOD_MSB"" (1<<4)"iismod |= S3C2410_IISMOD_MSB;


该芯片只提供两种数据格式,一种是 MSB (LEFT) JUSTIFIED,另外一种是标准的IIS格式。
IIS 格式数据是经过一个 SCLK 位时钟后,才输入第一个数据"MSB"(SD 上空了一个 SCLK时钟)。最后也是以“MSB”结束。

MSB 格式是在第一个 SCLK 时钟就立刻输出了第一个数据。

五. I2S的s3c24xx_i2s_hw_params函数 设置s3c24xx_i2s_hw_params.dai.cpu_dai.dma_data,假设现在是播放。
s3c24xx_i2s_hw_params.dai.cpu_dai.dma_data = s3c24xx_i2s_pcm_stereo_out static struct s3c24xx_pcm_dma_params s3c24xx_i2s_pcm_stereo_out = {.client= &s3c24xx_dma_client_out,.channel= DMACH_I2S_OUT,.dma_addr= S3C2410_PA_IIS + S3C2410_IISFIFO,.dma_size= 2,};

IIS FIFO寄存器的地址是 0x55000010,寄存器的大小是2字节。

设置传输每次传输多少位数据 #define S3C2410_IISMOD_16BIT (1<<3)iismod |= S3C2410_IISMOD_16BIT;writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);

六. s3c24xx_i2s_trigger函数 看播放状态,判断substream的方向,播放的话调用s3c24xx_snd_txctrl(1);录制调用s3c24xx_snd_rxctrl(1);启动DMA播放:s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STARTED); 七. IIS时钟设置 时钟源设置成 PCLK或者 MPLLin #define S3C2440_IISMOD_MPLL (1<<9)iismod |= S3C2440_IISMOD_MPLL;writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);

设置分频系数 writel(div, s3c24xx_i2s.regs + S3C2410_IISPSR);reg = readl(s3c24xx_i2s.regs + S3C2410_IISCON);writel(reg | S3C2410_IISCON_PSCEN, s3c24xx_i2s.regs + S3C2410_IISCON);


设置master时钟频率,是256fs还是384fs reg = readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & ~(S3C2410_IISMOD_384FS);writel(reg | div, s3c24xx_i2s.regs + S3C2410_IISMOD);

综上,采样率 = (PCLK or MPLLin)/f分频系数/(256 or 384)

设置串行时钟频率 reg = readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & ~S3C2410_IISMOD_FS_MASK;writel(reg | div, s3c24xx_i2s.regs + S3C2410_IISMOD);

八. I2S接口注册 注册时间:在启动内核是调用s3c24xx_i2s_init函数。在s3c24xx_i2s_init函数中注册I2S接口。 module_init(s3c24xx_i2s_init);static int __init s3c24xx_i2s_init(void){return snd_soc_register_dai(&s3c24xx_i2s_dai);} 注册到哪里:注册到一个dai_list的全局链表中,dai_list链表中是各种各样的dai接口。 int snd_soc_register_dai(struct snd_soc_dai *dai){if (!dai->name)return -EINVAL;/* The device should become mandatory over time */if (!dai->dev)printk(KERN_WARNING "No device for DAI %sn", dai->name);if (!dai->ops)dai->ops = &null_dai_ops;INIT_LIST_HEAD(&dai->list);mutex_lock(&client_mutex);list_add(&dai->list, &dai_list);snd_soc_instantiate_cards();mutex_unlock(&client_mutex);pr_debug("Registered DAI '%s'n", dai->name);return 0;} 九. 总结 s3c24xx_i2s_dai接口在内核起来时注册。s3c24xx_i2s_dai接口包含对芯片的I2S总线的波特率,数据传输模式等设置,一个硬件参数操作集s3c24xx_i2s_dai_ops。

参考博客:
https://blog.csdn.net/gqb_driver/article/details/8551551

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。