mini2440硬件篇之IIS

发布者:rockstar6最新更新时间:2016-12-01 来源: eefocus关键字:mini2440  硬件篇  IIS 手机看文章 扫描二维码
随时随地手机看文章

IIS(集成音频接口)于上个世纪80年代首先被Philips公司用于消费产品的音频设备。被广泛运用于CD、数字音频磁带、数字音频处理器和数字TV音频。

IIS的组成一般来说包括4个管脚:串行数据输入(IISDI)、串行数据输出(IISDO)、左/右通道选择(IISLRCK)、串行位时钟(IISCLK);产生IISLRCK和IISCLK的是主控器。在S3C2440上和IIS相关的接口还有一个用于提供CODEC时钟的管脚。就时序信号工作来说,当IISSCLK提供不间断的时钟信号的时候IISLRCK会以“数据位 + 1”的宽度方式产生周期信号。低电平时期表示左声道,高电平时期表示右声道。然后IISDI或者IISDO就按照一定的格式不断的发送/接收数据。

至于这种数据的格式,根据S3C2440的芯片资料的说明可以知道这样以MSB为首位可以让传输器和接收器不用知道对方的字长。数据还是按照各自的字长进行截取,如果不能匹配就会造成截断或者添0(意思是如果系统字长为32位而传输器的字长为16位那么传输的时候32位的系统数据就会被折成16位的)反正就是数据位从高到低的传输。至于MSB对齐格式,和上面的时序区别在于MSB总是被首先的传输在左右声道切换的时候。

  1.  芯片手册


语音芯片UDA1341TS

/* -----------------------------------------------------------------------------------

 *地址模式时序,掌握几个要点 

 *数据传输的时候保证L3MODE为低 

 *数据传输开始的信号是保证L3MODE为低L3CLOCK为高 

 *数据传输结束的信号是保证L3MODE为高L3CLOCK为高 

 *数据传输过程中一个L3CLOCK的周期传一个数据位 

 *数据模式时序,掌握几个要点 

 *数据传输的时候保证L3MODE为低 

 *数据传输开始的信号是保证L3MODE为高L3CLOCK为高 

 *数据传输结束的信号是保证L3MODE为高L3CLOCK为高 

 *数据传输过程中一个L3CLOCK的周期传一个数据位 

 *------------------------------------------------------------------------------------*/

 

2. mini2440电路图

3. S3C2440寄存器

s3C2440A的IIS总线接口用于实现一个CODEC接口来扩展8/16位立体声CODEC芯片到便携式应用。IIS总线接口支持IIS总线数据格式和MSB对齐数据格式。接口提供DMA传输模式用于FIFO访问代替一个中断。它能同步的传输和接收数据如同选择单独传输或者接收数据一样好。

时序的速率和音频数据的采样速率相关,因为IIS传输的是数字采样信号。所以数据的传输必须要达到采样速率。这里以一个wav文件作为例子(采样频率44.1KHz、声道数2、数据位数16)。该文件的声音要得到还原,那么数据必须以44.1KHz的速率传输。但是数据是串行传输的,为了在指定时间传输到数据,所以传输速率必须要乘以16才能一个数据以44.1KHz的速率传输,然后由于声道数位2,所以有两个通道要同时传输数据。但是传输通道只有一个,所以为了保证同时,还要在此基础上乘以2。根据上面的时序可以知道是SCLK在控制整个时序,所以得出IISSCLK=采样频率×采样位数×通道数。这里为了简便起见,采样频率记为fs。于是IISSCLK为32fs。知道一个管脚的时序,其他时序也就好确定了。

在S3C2440下,IIS的配置都是通过寄存器来完成的。下面总结一些S3C2440使用IIS接口需要做的一些配置工作。

IIS相关的寄存器:

IISCON寄存器

功能名称

说明

LR_CH_INDEX

[8]

左/右声道索引

0——左

1——右

TRANS_FIFO_RFLAG

[7]

传输FIFO准备标识

0——空

1——非空

RECV_FIFO_RFLAG

[6]

接收FIFO准备标识

0——满

1——非满

TRANS_DMA_EN

[5]

传输DMA服务请求

0——关闭

1——使能

RECV_DMA_EN

[4]

接收DMA服务请求

0——关闭

1——使能

TRANS_CH_IDLE_CMD

[3]

在Idle状态IISLRCK是非活动的(暂停Tx)

0——Not idle

1——Idle

RECV_CH_IDLE_CMD

[2]

在Idle状态IISLRCK是非活动的(暂停Rx)

0——Not idle

1——Idle

IIS_PRESCALER

[1]

IIS预分频

0——关闭

1——开启

IIS_EN

[0]

IIS接口使能

0——关闭

1——开启

IISMOD寄存器

功能名称

说明

MA_CLK_SELECT

[9]

主时钟选择

0——PCLK

1——MPLLin

MA_SL_MODE

[8]

主/从模式选择

0——主模式(IISLRCK和IISCLK是输出模式)

1——从模式(IISLRCK和IISCLK是输入模式)

TX_RX_MODE

[7:6]

传输/接收模式选择

00——无传输

01——接收模式

10——传输模式

11——传输和接收模式

LR_CH_EN

[5]

左右声道使能

0——右声道

1——左声道

SER_FORMAT

 [4]

串行接口格式

0——IIS兼容格式

1——MSB对齐格式(最高位左对齐)

SER_DATA_BIT

[3]

串行数据位数

0——8位

1——16位

MA_CLK_FS

[2]

主时钟频率选择

0——256fs

1——384fs

(fs:采样频率)

SCLK

[1:0]

串行时钟频率选择

00——16fs

01——32fs

10——48fs

11——保留

IISPSR寄存器

功能名称

说明

PRE_A

[9:5]

预分频器A的值

PRE_B

[4:0]

预分频器B的值

注意:选择IIS的时钟源(PCLK或者MPLLin)后,经过两个预分频器处理后会分别得到IISSCLK、IISLRCK和CDCLK(预分频器A得到IISSCLK、IISLRCK;预分频器B得到CDCLK)。一般来说,这两个预分频器的值N相等。这里通过CDCLK来计算预分频器B的N值来推知预分频器A的N值,计算公式为CDCLK=时钟源/(N+1)。

IISFCON寄存器

功能名称

说明

TX_FIFO_MODE

[15]

传输FIFO访问模式选择

0——普通

1——DMA

RX_FIFO_MODE

[14]

接收FIFO访问模式选择

0——普通

1——DMA

TX_FIFO_EN

[13]

传输FIFO使能位

0——关闭

1——使能

RX_FIFO_EN

[12]

接收FIFO使能位

0——关闭

1——使能

传输FIFO数据计数

[11:6]

数据计数值0~32

接收FIFO数据计数

[5:0]

数据计数值0~32

IISFIFO寄存器

功能名称

说明

FENTRY

[15:0]

IIS FIFO寄存器保存传输或者接收的音频数据值

 

3.1. DMA

S3C2440支持4通道位于系统总线和外围设备总线之间的DMA控制器。每个DMA控制器通道能执行数据搬运在系统总线设备和/或外围总线设备之间而没有限制。换句话说,每个通道能处理下面4种情形:

1. 源和目地都在系统总线里

2. 源在系统总线目地在外围总线

3. 源在外围总线目地在系统总线

4. 源和目地都在外围总线

DMA的优势是它在传输数据的时候不需要CPU的干预。DMA操作能被软件初始化,或者响应来自内部外围总线或者扩展请求管脚。

DMA请求资源

各个DMA控制器的通道能选择其中一个DMA请求资源,如果H/W DMA请求模式被DCON寄存器选择(注意如果S/W请求模式被选择,这个DMA请求资源无任何意义)。表8-1展示了4个DMA资源于各个通道。


 

 DMA操作

空闲时:DMA_ACK = 0;INT_REQ = 0;

单服务:知道CURR_TC计数变为0;

全服务:完成一次原子操作;

完成后:DMA_ACK =1;INT_REQ = 1;

传输大小

单元(unit)和突发(Burst)

iis.h


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: iis.h  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-08-12 

  7.  * Description:iis音频驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11.   

  12. /*IIS调试等级*/  

  13. #define DBG_IIS_LEVEL   1  

  14.   

  15. /*采样频率选择*/  

  16. #define FRQ_SELECT  4  

  17.   

  18. /*使用DMA传输数据*/  

  19. //#define   IIS_USE_DMA  

  20.   

  21. /*引脚定义*/  

  22. #define L3C     (1<<4)              //GPB4 = L3CLOCK  

  23. #define L3D     (1<<3)              //GPB3 = L3DATA  

  24. #define L3M     (1<<2)              //GPB2 = L3MODE  

  25.   

  26. #define MIN_VOLUME  0x01  

  27. #define MID_VOLUME  0x20  

  28. #define MAX_VOLUME  0x3e     //==音量最大值  

  29.   

  30. /*缓冲区产度*/  

  31. #define SOUND_DATA_LEN      243552  

  32.   

  33. /*函数原型*/  

  34.   

  35. /*************************************************************** 

  36.  ** 函数名称:void SoundRecord(unsigned char *pucRecBuf, unsigned long ulSize) 

  37.  ** 函数功能:录音 

  38.  ** 入口参数:pucPlayBuf:放音缓冲区;ulSize:缓冲区大小 

  39.  ** 出口参数:无 

  40.  ** 返        回:无 

  41.  ***************************************************************/  

  42. void SoundRecord(unsigned char *pucRecBuf, unsigned long ulSize);  

  43.   

  44.   

  45. /*************************************************************** 

  46.  ** 函数名称:void SoundPlay(unsigned char *pucPlayBuf, unsigned long ulSize) 

  47.  ** 函数功能:放音 

  48.  ** 入口参数:pucPlayBuf:放音缓冲区;ulSize:缓冲区大小 

  49.  ** 出口参数:无 

  50.  ** 返    回值:无 

  51.  ***************************************************************/  

  52. void SoundPlay(unsigned char *pucPlayBuf, unsigned long ulSize);  

  53.   

  54.   

  55. /*************************************************************** 

  56.  ** 函数名称:void SoundTest(void) 

  57.  ** 函数功能:录音和放音测试 

  58.  ** 入口参数:无 

  59.  ** 出口参数:无 

  60.  ** 返        回:无 

  61.  ***************************************************************/  

  62. void SoundTest(void);  


iis.c


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: iis.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-08-12 

  7.  * Description:iis音频驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #include "common.h"  

  12. #include "core.h"  

  13. #include "iis.h"  

  14. #include "WindowsXP_Wav.h"  

  15. //#include "AudioDrv.h"  

  16.   

  17. static int read_dma = 1;  

  18. static int play_dma = 1;  

  19.   

  20. static struct{  

  21.     U16 Freq;  

  22.     U32 MPLL;  

  23.     U16 PreScaler;  

  24.     U8  ofs;  

  25. }CodecPara[7] =   

  26. {  

  27.     {8000 , (123<<12) | (6<<4) | 0, (23<<5) | 23, 0},  

  28.     {11025, (229<<12) | (5<<4) | 1, (11<<5) | 11, 1},  

  29.     {16000, (123<<12) | (6<<4) | 0, (11<<5) | 11, 0},  

  30.     {22050, (229<<12) | (5<<4) | 1, (5<<5)  | 5 , 1},  

  31.     {32000, (123<<12) | (6<<4) | 0, (5<<5)  | 5 , 0},  

  32.     {44100, (229<<12) | (5<<4) | 1, (2<<5)  | 2 , 1},  

  33.     {48000, (123<<12) | (6<<4) | 0, (3<<5)  | 3 , 0}  

  34. };  

  35.   

  36.   

  37.   

  38. /*************************************************************** 

  39.  ** 函数名称:static void __irq DMA2_play_done(void) 

  40.  ** 函数功能:放音DMA2中断 

  41.  ** 入口参数:无 

  42.  ** 出口参数:无 

  43.  ** 返        回:无 

  44.  ***************************************************************/  

  45. static void __irq DMA2_play_done(void)  

  46. {  

  47.     //清除悬挂的DMA2中断  

  48.     ClearPending(BIT_DMA2);     //Clear pending bit  

  49.   

  50.     play_dma = 0;  

  51. }  

  52.   

  53.   

  54. /*************************************************************** 

  55.  ** 函数名称:static void DMA2_play_close(void) 

  56.  ** 函数功能:关闭DMA2 

  57.  ** 入口参数:无 

  58.  ** 出口参数:无 

  59.  ** 返        回:无 

  60.  ***************************************************************/  

  61. static void DMA2_play_close(void)  

  62. {  

  63.     //DMA MASK TRIGGER  

  64.     // 2 - STOP - Stop the DMA operation. - 1: DMA stops as soon as the current atomic transfer ends. If there  

  65.     //                                          is no current running atomic transfer, DMA stops immediately  

  66.     rDMASKTRIG2 = (1<<2);  

  67.   

  68.     DisableIrq(BIT_DMA2);  

  69. }  

  70.   

  71.   

  72. /*************************************************************** 

  73.  ** 函数名称:static void DMA2_play_init(U32 src_addr , U32 dst_addr , U32 len) 

  74.  ** 函数功能:初始化DMA2为输入放音功能 

  75.  ** 入口参数:src_addr:源地址;dst_addr:目标地址;len:需要传输的数据长度 

  76.  ** 出口参数:无 

  77.  ** 返        回:无 

  78.  ***************************************************************/  

  79. static void DMA2_play_init(U32 src_addr , U32 dst_addr , U32 len)  

  80. {  

  81.     /*DMA触发屏蔽,关闭DMA*/  

  82.     // 2 - STOP - Stop the DMA operation. - 1: DMA stops as soon as the current atomic transfer ends. If there  

  83.     //                                          is no current running atomic transfer, DMA stops immediately  

  84.     rDMASKTRIG2 = (1<<2);  

  85.   

  86.     /*DMA2初始源,放音源是内存*/  

  87.     rDISRC2 = src_addr;  

  88.   

  89.     /*DMA2初始源控制*/  

  90.     // 1 - LOC - 0: the destination is in the system bus (AHB)  

  91.     // 0 - INC - Bit 0 is used to select the address increment. - 0 = Increment  

  92.     rDISRCC2 = (0 << 1) | (0 << 0);  

  93.   

  94.     /*初始目标,放音目标是IIS外设FIFO*/  

  95.     rDIDST2 = dst_addr;  

  96.   

  97.     /*DMA初始目标控制*/  

  98.     // 2 - CHK_INT - Select interrupt occurrence time when auto reload is setting - 1: Interrupt will occur after auto-reload is performed  

  99.     // 1 - LOC - 1: the source is in the peripheral bus (APB)  

  100.     // 0 - INC - Bit 0 is used to select the address increment. - 1= Fixed  

  101.     rDIDSTC2 = (1 << 2) | (1 << 1) | (1 << 0);  

  102.   

  103.     /*DMA控制*/  

  104.     // 31 - DMD_HS - 1: Handshake mode will be selected.  

  105.     // 30 - SYNC - 0: DREQ and DACK are synchronized to PCLK (APB clock).  

  106.     // 29 - INT - 1: Interrupt request is generated when all the transfer is done  

  107.     // 28 - TSZ - 0: A unit transfer is performed.  

  108.     // 27 - SERVMODE - 0: Single service mode is selected in which after each atomic  

  109.     //                      transfer (single or burst of length four) DMA stops and waits for  

  110.     //                      another DMA request.  

  111.     // 26:24 - HWSRCSEL - Select DMA request source for each DMA - 000:I2SSDO  

  112.     // 23 - SWHW_SEL - Select the DMA source between software (S/W request mode) and  

  113.     //                     hardware (H/W request mode)  

  114.     //                     1: DMA source selected by bit[26:24] triggers the DMA operation  

  115.     // 22 - RELOAD - 1: DMA channel (DMA REQ) is turned off when a current value of  

  116.     //                    transfer count becomes 0. The channel on/off bit (DMASKTRIGn[1])  

  117.     //                    is set to 0 (DREQ off) to prevent unintended further start of new DMA operation.  

  118.     // 21:20 - DSZ - 01 = Half word  

  119.     rDCON2 = (1 << 31) | (0 << 30) | (1 << 29) | (0 << 28) | (0 << 27) | (0 << 24) | (1 << 23) | (1 << 22) | (1 << 20);  

  120.   

  121.     //设置要传输的数据次数  

  122.     rDCON2 &= ~0xfffff;  

  123.     rDCON2 |= len & 0xfffff;  

  124.   

  125.     //设置DMA传输完成后的中断服务函数  

  126.     pISR_DMA2 = (U32)DMA2_play_done;  

  127.   

  128.     //开启DMA的中断  

  129.     EnableIrq( BIT_DMA2);  

  130.   

  131.     //DMA MASK TRIGGER  

  132.     // 2 - STOP - Stop the DMA operation. - 0 = Don't Stop  

  133.     // 1 - ON_OFF - DMA channel on/off bit - 1: DMA channel is turned on and the DMA request is handled  

  134.     // 0 - SW_TRIG - 0 = Hardware control it  

  135.     rDMASKTRIG2 = (0 << 2) | (1 << 1) | (0 << 0);  

  136. }  

  137.   

  138.   

  139. /*************************************************************** 

  140.  ** 函数名称:static void __irq DMA2_read_done(void) 

  141.  ** 函数功能:录音DMA2中断 

  142.  ** 入口参数:无 

  143.  ** 出口参数:无 

  144.  ** 返        回:无 

  145.  ***************************************************************/  

  146. static void __irq DMA2_read_done(void)  

  147. {  

  148.     //清除悬挂的DMA2中断  

  149.     ClearPending(BIT_DMA2);     //Clear pending bit  

  150.   

  151.     read_dma = 0;  

  152. }  

  153.   

  154.   

  155. /*************************************************************** 

  156.  ** 函数名称:static void DMA2_read_close(void) 

  157.  ** 函数功能:关闭DMA2 

  158.  ** 入口参数:无 

  159.  ** 出口参数:无 

  160.  ** 返        回:无 

  161.  ***************************************************************/  

  162. static void DMA2_read_close(void)  

  163. {  

  164.     //DMA MASK TRIGGER  

  165.     // 2 - STOP - Stop the DMA operation. - 1: DMA stops as soon as the current atomic transfer ends. If there  

  166.     //                                          is no current running atomic transfer, DMA stops immediately  

  167.     rDMASKTRIG2 = (1<<2);  

  168.   

  169.     DisableIrq(BIT_DMA2);  

  170. }  

  171.   

  172. /*************************************************************** 

  173.  ** 函数名称:static void DMA_read_init(U32 src_addr , U32 dst_addr , U32 len) 

  174.  ** 函数功能:初始化DMA2为输入录音功能 

  175.  ** 入口参数:src_addr:源地址;dst_addr:目标地址;len:需要传输的数据长度 

  176.  ** 出口参数:无 

  177.  ** 返        回:无 

  178.  ***************************************************************/  

  179. static void DMA2_read_init(U32 src_addr , U32 dst_addr , U32 len)  

  180. {  

  181.     /*DMA触发屏蔽,关闭DMA*/  

  182.     // 2 - STOP - Stop the DMA operation. - 1: DMA stops as soon as the current atomic transfer ends. If there  

  183.     //                                          is no current running atomic transfer, DMA stops immediately  

  184.     rDMASKTRIG2 = (1<<2);  

  185.   

  186.     /*DMA2初始源,录音源是外设*/  

  187.     rDISRC2 = src_addr;  

  188.   

  189.     /*DMA2初始源控制*/  

  190.     // 1 - LOC - 1:  the source is in the peripheral bus (APB)  

  191.     // 0 - INC - Bit 0 is used to select the address increment. - 1= Fixed  

  192.     rDISRCC2 = (1 << 1) | (1 << 0);  

  193.   

  194.     /*初始目标,录音目标是内存*/  

  195.     rDIDST2 = dst_addr;  

  196.   

  197.     /*DMA初始目标控制*/  

  198.     // 2 - CHK_INT - Select interrupt occurrence time when auto reload is setting - 1: Interrupt will occur after auto-reload is performed  

  199.     // 1 - LOC - 0: the destination is in the system bus (AHB)  

  200.     // 0 - INC -  Bit 0 is used to select the address increment. - 0 = Increment  

  201.     rDIDSTC2 = (1 << 2) | (0 << 1) | (0 << 0);  

  202.   

  203.     /*DMA控制*/  

  204.     // 31 - DMD_HS - 1: Handshake mode will be selected.  

  205.     // 30 - SYNC - 0: DREQ and DACK are synchronized to PCLK (APB clock).  

  206.     // 29 - INT - 1: Interrupt request is generated when all the transfer is done  

  207.     // 28 - TSZ - 0: A unit transfer is performed.  

  208.     // 27 - SERVMODE - 0: Single service mode is selected in which after each atomic  

  209.     //                      transfer (single or burst of length four) DMA stops and waits for  

  210.     //                      another DMA request.  

  211.     // 26:24 - HWSRCSEL - Select DMA request source for each DMA - 000:I2SSDO  

  212.     // 23 - SWHW_SEL - Select the DMA source between software (S/W request mode) and  

  213.     //                     hardware (H/W request mode)  

  214.     //                     1: DMA source selected by bit[26:24] triggers the DMA operation  

  215.     // 22 - RELOAD - 1: DMA channel (DMA REQ) is turned off when a current value of  

  216.     //                    transfer count becomes 0. The channel on/off bit (DMASKTRIGn[1])  

  217.     //                    is set to 0 (DREQ off) to prevent unintended further start of new DMA operation.  

  218.     // 21:20 - DSZ - 01 = Half word  

  219.     rDCON2 = (1 << 31) | (0 << 30) | (1 << 29) | (0 << 28) | (0 << 27) | (1 << 24) | (1 << 23) | (1 << 22) | (1 << 20);  

  220.   

  221.     //设置要传输的数据次数  

  222.     rDCON2 &= ~0xfffff;  

  223.     rDCON2 |= len & 0xfffff;  

  224.   

  225.     //设置DMA传输完成后的中断服务函数  

  226.     pISR_DMA2 = (U32)DMA2_read_done;  

  227.   

  228.     //开启DMA的中断  

  229.     EnableIrq( BIT_DMA2);  

  230.   

  231.     //DMA MASK TRIGGER  

  232.     // 2 - STOP - Stop the DMA operation. - 0 = Don't Stop  

  233.     // 1 - ON_OFF - DMA channel on/off bit - 1: DMA channel is turned on and the DMA request is handled  

  234.     // 0 - SW_TRIG - 0 = Hardware control it  

  235.     rDMASKTRIG2 = (0 << 2) | (1 << 1) | (0 << 0);  

  236. }  

  237.   

  238.   

  239. /* ----------------------------------------------------------------------------------- 

  240.  *地址模式时序,掌握几个要点  

  241.  *数据传输的时候保证L3MODE为低  

  242.  *数据传输开始的信号是保证L3MODE为低L3CLOCK为高  

  243.  *数据传输结束的信号是保证L3MODE为高L3CLOCK为高  

  244.  *数据传输过程中一个L3CLOCK的周期传一个数据位  

  245.  *数据模式时序,掌握几个要点  

  246.  *数据传输的时候保证L3MODE为低  

  247.  *数据传输开始的信号是保证L3MODE为高L3CLOCK为高  

  248.  *数据传输结束的信号是保证L3MODE为高L3CLOCK为高  

  249.  *数据传输过程中一个L3CLOCK的周期传一个数据位  

  250.  *------------------------------------------------------------------------------------*/   

  251.   

  252. /*************************************************************** 

  253.  ** 函数名称:static void WrL3Data(U8 data,int halt) 

  254.  ** 函数功能:通过L3接口写数据到UDA1341 

  255.  ** 入口参数:data:数值 

  256.  ** 出口参数:无 

  257.  ** 返        回:无 

  258.  ***************************************************************/  

  259. static void WrL3Data(U8 data, int halt)  

  260. {  

  261.     S32 i,j;  

  262.   

  263.     if(halt)  

  264.     {  

  265.         rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | L3C;  

  266.         for(j=0;j<4;j++);                                //tstp(L3) > 190ns  

  267.     }  

  268.   

  269.     //将L3D,L3M,L3C这3个位清0后将L3C和L3M位置1  

  270.     rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);  

  271.   

  272.     //tsu(L3)D时序,需要190ns  

  273.     for(j=0;j<4;j++);  

  274.   

  275.       //GPB[4:2]=L3C:L3D:L3M  

  276.     for(i=0;i<8;i++)  

  277.     {  

  278.         //如果数据为1  

  279.         if(data & 0x1)  

  280.         {  

  281.            rGPBDAT &= ~L3C;   

  282.            rGPBDAT |= L3D;   

  283.             //L3C需要在低位保持250ns  

  284.            for(j=0;j<4;j++);  

  285.            rGPBDAT |= (L3C | L3D);  

  286.             //L3C需要在高位保持250ns  

  287.            for(j=0;j<4;j++);  

  288.         }  

  289.     //数据为0  

  290.         else  

  291.         {  

  292.            rGPBDAT &= ~L3C;    

  293.            rGPBDAT &= ~L3D;     

  294.             //L3C需要在低位保持250ns  

  295.            for(j=0;j<4;j++);       

  296.            rGPBDAT |= L3C;      

  297.            rGPBDAT &= ~L3D;   

  298.             //L3C需要在高位保持250ns  

  299.            for(j=0;j<4;j++);            

  300.         }  

  301.     //传送下一位数据  

  302.         data >>= 1;                    

  303.     }  

  304.     rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);   

  305. }  

  306.   

  307.   

  308. /*************************************************************** 

  309.  ** 函数名称:static void WrL3Addr(U8 data) 

  310.  ** 函数功能:通过L3接口写地址到UDA1341 

  311.  ** 入口参数:data:地址值 

  312.  ** 出口参数:无 

  313.  ** 返        回:无 

  314.  ***************************************************************/  

  315. static void WrL3Addr(U8 data)  

  316. {         

  317.     S32 i,j;  

  318.   

  319.     //清除L3D,L3M,L3C这3个位之后置L3C位为1  

  320.     rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | L3C;   

  321.   

  322.     //将L3M置为0之后需要需要190ns的时序才能降低L3C  

  323.     for(j=0;j<4;j++);                   //tsu(L3) > 190ns  

  324.   

  325.     for(i=0;i<8;i++)                    //LSB first  

  326.     {  

  327.         //如果数据为1  

  328.         if(data & 0x1)          

  329.         {  

  330.             rGPBDAT &= ~L3C;     

  331.             rGPBDAT |= L3D;      

  332.             //L3C需要在低位保持250ns  

  333.             for(j=0;j<4;j++);     

  334.             rGPBDAT |= L3C;    

  335.             rGPBDAT |= L3D;    

  336.             //L3C需要在高位保持250ns  

  337.             for(j=0;j<4;j++);     

  338.         }  

  339.     //数据为0  

  340.         else                        

  341.         {  

  342.             rGPBDAT &= ~L3C;    

  343.             rGPBDAT &= ~L3D;      

  344.             //L3C需要在低位保持250ns  

  345.             for(j=0;j<4;j++);           

  346.             rGPBDAT |= L3C;         

  347.             rGPBDAT &= ~L3D;   

  348.             //L3C需要在高位保持250ns  

  349.             for(j=0;j<4;j++);             

  350.         }  

  351.     //传送下一位数据  

  352.         data >>= 1;  

  353.     }  

  354.     rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);    

  355. }  

  356.   

  357.   

  358. /*************************************************************** 

  359.  ** 函数名称:static void AdjVolume(unsigned char volume)     

  360.  ** 函数功能:调整音量 

  361.  ** 入口参数:volume:音量值 

  362.  ** 出口参数:无 

  363.  ** 返    回:无 

  364.  ***************************************************************/  

  365. static void AdjVolume(unsigned char volume)   

  366. {      

  367.     WrL3Addr(0x14 + 0);           

  368.     WrL3Data(MAX_VOLUME-volume, 0);  

  369. }  

  370.   

  371.   

  372. /*************************************************************** 

  373.  ** 函数名称:void UDA1341_play_init(void) 

  374.  ** 函数功能:UDA1341放音初始化 

  375.  ** 入口参数:无 

  376.  ** 出口参数:无 

  377.  ** 返        回:无 

  378.  ***************************************************************/  

  379. void UDA1341_play_init(void)  

  380. {     

  381. /*------------------------写状态----------------------------*/   

  382.     //STATUS (000101xx+10)  

  383.     WrL3Addr(0x14 + 2); //==写状态,复位  

  384.     //0,1,10,000,0 : Status 0,Reset,256fs,IIS-bus,no DC-filtering  

  385.     //0,1,10,000,0--UDA1341TS设备重启,系统时钟设置为256fs,数据输入格式设置IIS总线,没有DC滤波  

  386.     WrL3Data(0x60,0);  

  387.       

  388.     //STATUS (000101xx+10)  

  389.     WrL3Addr(0x14 + 2); //==写状态,频率384fs  

  390.     //0,0,01,000,0 : Status 0,No reset,384fs,IIS-bus,no DC-filtering  

  391.     //0,0,01,000,0--UDA1341TS设备不重启,系统时钟设置为384fs,数据输入格式设置为IIS总线,没有DC滤波  

  392.     WrL3Data(0x10,0);  

  393.   

  394.     ////STATUS (000101xx+10)  

  395.     WrL3Addr(0x14 + 2); //==写状态,DAC输出6DB增益  

  396.     //1,1,0,0, 0,0,01  

  397.     //Status 1,Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,DAC non-inverting  

  398.     //,Single speed playback,ADC-Off DAC-On  

  399.     //1,1,0,0,0,0,01--DAC输出增益选择为6db(OGS),ADC输入增益选择为0db(IGS),ADC极性不翻转,DAC极性不翻转,倍速回放关闭,ADC关闭DAC启动  

  400.     WrL3Data(0xc1,0);  

  401.                

  402. #if 0  

  403.     WrL3Addr(0x14 + 0);  

  404.     /*-------直接地址操作-------*/  

  405.     // - 设置音量  

  406.     WrL3Data( 0x10, 0);  

  407. #endif  

  408. }  

  409.   

  410.   

  411. /*************************************************************** 

  412.  ** 函数名称:void UDA1341_record_init(void) 

  413.  ** 函数功能:UDA1341录音初始化 

  414.  ** 入口参数:无 

  415.  ** 出口参数:无 

  416.  ** 返        回:无 

  417.  ***************************************************************/  

  418. void UDA1341_record_init(void)  

  419. {     

  420. /*---------------------------写状态------------------------*/  

  421.     /*写状态,复位*/  

  422.     WrL3Addr(0x14 + 2);   

  423.         //0,1,10, 000,0 : Status 0,Reset,256fs,IIS-bus,no DC-filtering  

  424.     WrL3Data(0x60,0);  

  425.       

  426.     /*写状态,设置频率*/  

  427.     WrL3Addr(0x14 + 2);  

  428.     //0 - Status 0  

  429.     //0 - No reset,  

  430.     //01 - 384fs,  

  431.     //000 - IIS-bus  

  432.     //0 - no DC-filtering  

  433.     WrL3Data(0x10,0);  

  434.   

  435.     /*写状态,ADC输入6DB增益*/  

  436.     WrL3Addr(0x14 + 2);  

  437.     //1,0,0,0, 0,0,01  

  438.     //Status 1,Gain of DAC 0 dB,Gain of ADC 6dB,ADC non-inverting,DAC non-inverting  

  439.     //,Single speed playback,ADC-On DAC-Off  

  440.     WrL3Data(0xa2,0);  

  441.   

  442. /*-----------------------------写DATA0----------------------------*/  

  443.     WrL3Addr(0x14 + 0);  

  444.  #if 0  

  445.     /*-------直接地址操作-------*/  

  446.     // - 设置音量  

  447.     WrL3Data( 30, 0);  

  448.   

  449.     // - 设置高低音,01,11 1011--低音18~24,高音6dB  

  450.     WrL3Data( 0x7b, 0);   

  451.   

  452.     // - 峰值检测,去加重,静音,音频滤波模式,  

  453.       

  454.   

  455.     /*-------间接地址操作-------*/  

  456.     // - 寄存器一,设置通道一的混频增益;MA = 0dB  

  457.     WrL3Data(0xc0,0);  

  458.     WrL3Data(0xe0,0);  

  459.       

  460.     // - 寄存器二,设置通道二的混频增益;MB = 0dB  

  461.     WrL3Data(0xc1,0);  

  462.     WrL3Data(0xe0,0);     

  463. #endif    

  464.     // - 寄存器三,设置麦克风灵敏度和混频器模式  

  465.     // 111,1 10,11:MIC Amplifier Gain 27dB, input 1 X MA + input 2 X MB  

  466.     WrL3Data(0xc2,0);  

  467.     WrL3Data(0xe2,0);  

  468.       

  469.     // - 寄存器四和五,设置AGC  

  470.     //111,1 00,00 : DATA0, Enable AGC, 00, input amplifier gain channel 2 (2bits)  

  471.     WrL3Data(0xc4,0);  

  472.     WrL3Data(0xf3,0);  

  473.     WrL3Data(0xc5,0);  

  474.     WrL3Data(0xff,0);  

  475. #if 0  

  476.     // - 寄存器六,设置自动增益时间控制常数  

  477.     //   

  478.     WrL3Data(0x00,0);  

  479.     WrL3Data(0x00,0);  

  480. #endif  

  481.   

  482. }  

  483.   

  484.   

  485. /*************************************************************** 

  486.  ** 函数名称:void IIS_transmit_init(void) 

  487.  ** 函数功能:IIS传输数据初始化 

  488.  ** 入口参数:无 

  489.  ** 出口参数:无 

  490.  ** 返        回:无 

  491.  ***************************************************************/  

  492. void IIS_transmit_init(void)  

  493. {  

  494.     //IIS PRESCALER  

  495.     //Prescaler control A - 5  

  496.     //Prescaler control B - 5  

  497.     rIISPSR  = CodecPara[FRQ_SELECT].PreScaler;  

  498.   

  499.     //IIS CONTROL  

  500.     // 5 - Transmit DMA service request - 1 =Enable  

  501.     // 4 - Receive DMA service request - 0 =Disable  

  502.     // 3 - Transmit channel idle command - 0 = Not idle  

  503.     // 2 - Receive channel idle command - 1 = Idle  

  504.     // 1 - IIS prescaler - 1 =Enable  

  505.     // 0 - IIS interface - 0 =Disable (stop)  

  506.     rIISCON  = (0<<5) | (0<<4) | (0<<3) | (1<<2) | (1<<1);  

  507. #ifdef IIS_USE_DMA  

  508.     rIISCON |= 1<<5;  

  509. #endif  

  510.       

  511.     //IIS MODE REGISTER  

  512.     // 9 - Master clock select - 0 = PCLK  

  513.     // 8 - Master/slave mode select - 0 = Master mode (IISLRCK and IISCLK are output mode).  

  514.     // 7:6 - Transmit/receive mode select - 10 = Transmit mode  

  515.     // 5 - Active level of left/right channel - 0 = Low for left channel (High for right channel)  

  516.     // 4 - Serial interface format - 0 = IIS compatible format  

  517.     // 3 - Serial data bit per channel - 1 = 16-bit  

  518.     // 2 - Master clock frequency -select - 1 = 384fs (fs: sampling frequency)  

  519.     // 1:0 - Serial bit clock frequency select - 01 = 32fs  

  520.     rIISMOD  = (0<<9) | (0<<8) | (2<<6) | (0<<5) | (0<<4) | (1<<3) | (1<<2) | (1<<0);     

  521.   

  522.     //IIS FIFO CONTROL  

  523.     // 15 - Transmit FIFO access mode select - 1 = DMA  

  524.     // 14 - Receive FIFO access mode select - 0 = Normal  

  525.     // 13 - Transmit FIFO - 1 = Enable  

  526.     // 12 - Receive FIFO - 0 = Disable  

  527.     //rIISFCON = (1<<15) + (1<<13);      

  528.     rIISFCON = (0<<15) | (0<<14) |  (1<<13) | (0<<12);      

  529. #ifdef IIS_USE_DMA  

  530.     rIISFCON |= 1<<15;  

  531. #endif  

  532.     //IIS interface - Enable (run)  

  533.     rIISCON |= 0x1;                 

  534.   

  535. }  

  536.   

  537.   

  538. /*************************************************************** 

  539.  ** 函数名称:void IIS_receive_init(void) 

  540.  ** 函数功能:IIS接收采样数据初始化 

  541.  ** 入口参数:无 

  542.  ** 出口参数:无 

  543.  ** 返        回:无 

  544.  ***************************************************************/  

  545. void IIS_receive_init(void)  

  546. {  

  547.     //IIS PRESCALER  

  548.     //Prescaler control A - 5  

  549.     //Prescaler control B - 5  

  550.     rIISPSR  = CodecPara[FRQ_SELECT].PreScaler;  

  551.   

  552.     //IIS CONTROL  

  553.     // 5 - Transmit DMA service request -0 =Disable  

  554.     // 4 - Receive DMA service request - 1 =Enable  

  555.     // 3 - Transmit channel idle command - 1 =Idle  

  556.     // 2 - Receive channel idle command - 0 =Not Idle  

  557.     // 1 - IIS prescaler - 1 =Enable  

  558.     // 0 - IIS interface - 0 =Disable (stop)  

  559.     rIISCON  = (0<<5) | (0<<4) | (1<<3) | (0<<2) | (1<<1);  

  560. #ifdef IIS_USE_DMA  

  561.     rIISCON |= 1<<4;  

  562. #endif    

  563.     //IIS MODE REGISTER  

  564.     // 9 - Master clock select - 0 = PCLK  

  565.     // 8 - Master/slave mode select - 0 = Master mode (IISLRCK and IISCLK are output mode).  

  566.     // 7:6 - Transmit/receive mode select - 01 = Receive mode  

  567.     // 5 - Active level of left/right channel - 0 = Low for left channel (High for right channel)  

  568.     // 4 - Serial interface format - 0 = IIS compatible format  

  569.     // 3 - Serial data bit per channel - 1 = 16-bit  

  570.     // 2 - Master clock frequency -select - 1 = 384fs (fs: sampling frequency)  

  571.     // 1:0 - Serial bit clock frequency select - 01 = 32fs  

  572.     rIISMOD  = (0<<9) | (0<<8)  | (1<<6) | (0<<5) | (0<<4) | (1<<3) | (1<<2) | (1<<0);    

  573.   

  574.     //IIS FIFO CONTROL  

  575.     // 15 - Transmit FIFO access mode select - 0 = Normal  

  576.     // 14 - Receive FIFO access mode select - 1 = DMA  

  577.     // 13 - Transmit FIFO - 0 = Disable  

  578.     // 12 - Receive FIFO - 1 = Enable  

  579.     rIISFCON = (0<<15) | (0<<14) | (0<<13) | (1<<12);      

  580. #ifdef IIS_USE_DMA  

  581.     rIISFCON |= 1<<14;  

  582. #endif  

  583.     //IIS interface - Enable (run)  

  584.     rIISCON |= 0x1;                 

  585. }  

  586.   

  587.   

  588. /*************************************************************** 

  589.  ** 函数名称:void SoundGPIOInit(void) 

  590.  ** 函数功能:IIS和L3引脚初始化 

  591.  ** 入口参数:无 

  592.  ** 出口参数:无 

  593.  ** 返        回:无 

  594.  ***************************************************************/  

  595. void SoundGPIOInit(void)  

  596. {  

  597. //----------------------------------------------------------  

  598. //   

  599. //Ports  :   GPB4    GPB3   GPB2    

  600. //Signal :  L3CLOCK L3DATA L3MODE  

  601. //Setting:   OUTPUT OUTPUT OUTPUT   

  602. //           [9:8]   [7:6}  [5:4]  

  603. //Binary :     01  ,   01    01   

  604. //----------------------------------------------------------      

  605.     //设置GPB234为输出功能  

  606.     rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4);     

  607.   

  608.     //禁止GPB234的上拉功能  

  609.     rGPBUP  = rGPBUP  & ~(0x7<<2) | (0x7<<2);       

  610.   

  611.       

  612. //----------------------------------------------------------  

  613. //   

  614. //Ports  :  GPE4    GPE3   GPE2  GPE1    GPE0   

  615. //Signal : I2SSDO  I2SSDI CDCLK I2SSCLK I2SLRCK   

  616. //Binary :   10  ,   10     10 ,  10      10      

  617. //----------------------------------------------------------  

  618.     //禁止GPE01234的上拉功能  

  619.     rGPEUP  = rGPEUP  & ~(0x1f)  | 0x1f;     

  620.     //设置GPE01234的功能为  

  621.     //GPE0 - I2SLRCK  

  622.     //GPE1 - I2SSCLK  

  623.     //GPE2 - CDCLK  

  624.     //GPE3 - I2SDI  

  625.     //GPE4 - I2SDO  

  626.     rGPECON = rGPECON & ~(0x3ff) | 0x2aa;    

  627. }  

  628.   

  629.   

  630. /*************************************************************** 

  631.  ** 函数名称:void SoundPlay(unsigned char *pucRecBuf, unsigned long ulSize) 

  632.  ** 函数功能:放音 

  633.  ** 入口参数:pucPlayBuf:放音缓冲区;ulSize:缓冲区大小 

  634.  ** 出口参数:无 

  635.  ** 返        回:无 

  636.  ***************************************************************/  

  637. void SoundPlay(unsigned char *pucRecBuf, unsigned long ulSize)  

  638. {  

  639.     /*轮询方式需要的变量*/  

  640. #ifndef IIS_USE_DMA  

  641.     int i;  

  642.     int count = 0;  

  643.     unsigned char *pData = pucRecBuf;  

  644. #endif  

  645.       

  646.     DbgPrintX( DBG_IIS_LEVEL, "\rSound play test\n");  

  647.   

  648.     //初始化UDA1341为录音状态  

  649.     UDA1341_play_init();  

  650.   

  651.     //初始化IIS为录音状态  

  652.     IIS_transmit_init();  

  653.       

  654. #ifdef IIS_USE_DMA    

  655.     DMA2_play_init( (U32)pucRecBuf, (U32)IISFIFO, ulSize/2);  

  656.     while( play_dma )  

  657.     {  

  658.     }  

  659.       

  660.     play_dma = 1;  

  661.     DMA2_play_close();  

  662. #else  

  663.     while(count < ulSize)  

  664.     {  

  665.         //检测输入缓冲区是否满了  

  666.         if( (rIISCON & (1 << 7))==0 )  

  667.         {  

  668.             for(i=0; i<32; i++)  

  669.             {  

  670.                 rIISFIFO = *pData + (*(pData+1)<<8);  

  671.                 pData += 2;  

  672.             }  

  673.   

  674.             count += 64;  

  675.         }  

  676.     }     

  677. #endif   

  678. }  

  679.   

  680.   

  681. /*************************************************************** 

  682.  ** 函数名称:void SoundRecord(unsigned char *pucRecBuf, unsigned long ulSize) 

  683.  ** 函数功能:录音 

  684.  ** 入口参数:pucPlayBuf:放音缓冲区;ulSize:缓冲区大小 

  685.  ** 出口参数:无 

  686.  ** 返        回:无 

  687.  ***************************************************************/  

  688. void SoundRecord(unsigned char *pucRecBuf, unsigned long ulSize)  

  689. {  

  690.     /*轮询方式需要的变量*/  

  691. #ifndef IIS_USE_DMA  

  692.     int i;  

  693.     int count = 0;  

  694.     unsigned short tmp_data;  

  695.     unsigned char *pData = pucRecBuf;  

  696. #endif  

  697.       

  698.     DbgPrintX( DBG_IIS_LEVEL, "\rSound record test\n");  

  699.   

  700.     //初始化UDA1341为录音状态  

  701.     UDA1341_record_init();  

  702.   

  703.     //初始化IIS为录音状态  

  704.     IIS_receive_init();  

  705.       

  706. #ifdef IIS_USE_DMA    

  707.     DMA2_read_init( (U32)IISFIFO, (U32)pucRecBuf, ulSize/2);  

  708.     while( read_dma )  

  709.     {  

  710.     }  

  711.       

  712.     read_dma = 1;  

  713.     DMA2_read_close();  

  714. #else  

  715.     while(count < ulSize)  

  716.     {  

  717.         //检测输入缓冲区是否满了  

  718.         if( (rIISCON & (1 << 6))==0 )  

  719.         {  

  720.             for(i=0; i<32; i++)  

  721.             {  

  722.                 tmp_data = rIISFIFO;  

  723.                 *pData++ = tmp_data & 0xff;  

  724.                 *pData++ = ((tmp_data>>8) & 0xff);  

  725.             }  

  726.   

  727.             count += 64;  

  728.         }  

  729.     }     

  730. #endif   

  731. }  

  732.   

  733.   

  734. /*************************************************************** 

  735.  ** 函数名称:void SoundTest(void) 

  736.  ** 函数功能:录音和放音测试 

  737.  ** 入口参数:无 

  738.  ** 出口参数:无 

  739.  ** 返        回:无 

  740.  ***************************************************************/  

  741. void SoundTest(void)  

  742. {  

  743.     unsigned char key;  

  744.     unsigned int volume = 30;  

  745.     int count = 5;              //==测试次数  

  746.     unsigned long sound_size;   //==缓冲区大小  

  747.     unsigned char *sound_data;  //==缓冲区指针  

  748.   

  749.     unsigned int saveMpll = rMPLLCON;  //==保存时钟配置值  

  750.   

  751.     sound_size = SOUND_DATA_LEN;  

  752.     sound_data = (unsigned char *)_NONCACHE_STARTADDRESS;  

  753.   

  754.     rMPLLCON = CodecPara[FRQ_SELECT].MPLL;   //==配置时钟  

  755.   

  756.     SoundGPIOInit();   //==引脚初始化  

  757. #if 0  /*放音,音量调节测试,只支持DMA方式*/  

  758.     while(1)  

  759.     {  

  760.         DbgPrintX( DBG_IIS_LEVEL, "\rSound play test\n");  //==调试  

  761.       

  762.         //初始化UDA1341为输出状态  

  763.         UDA1341_play_init();  

  764.       

  765.         //初始化IIS为输出状态  

  766.         IIS_transmit_init();  

  767.           

  768.         key = Uart0GetChar();  

  769.   

  770.         if( key == ESC_KEY )  

  771.                 break;  

  772.   

  773.         if( (key == '+') && (volume <= MAX_VOLUME) )  

  774.         {  

  775.             volume += 4;  

  776.             AdjVolume(volume);  

  777.         }  

  778.   

  779.         if( (key == '-') && (volume >= MIN_VOLUME) )  

  780.         {  

  781.             volume -= 4;  

  782.             AdjVolume(volume);        

  783.         }         

  784.   

  785.         DMA2_play_init( (U32)WindowsXP_Wav, (U32)IISFIFO, sizeof(WindowsXP_Wav)/2);  

  786.   

  787.         while( play_dma )  

  788.         {  

  789.         }  

  790.   

  791.         play_dma =1;  

  792.         DMA2_play_close();  

  793.   

  794.     //  delay(1);   

  795.     }  

  796. #else  /*录音、放音测试*/  

  797.     while(count--)  

  798.     {  

  799.         SoundRecord(sound_data, sound_size);  

  800.         SoundPlay(sound_data, sound_size);  

  801.         delay(1);   

  802.     }  

  803. #endif  

  804.     rMPLLCON = saveMpll;  

  805. }  



关键字:mini2440  硬件篇  IIS 引用地址:mini2440硬件篇之IIS

上一篇:mini2440硬件篇之SPI
下一篇:mini2440硬件篇之RTC

推荐阅读最新更新时间:2024-03-16 15:22

玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】
前段时间研究了一下如何使用busybox编译和生成最简linux根文件系统(rootfs),并在mini2440开发板上使用NFS网络文件系统进行挂载启动,今天继续研究如何将该根文件系统烧录到开发板上去,以便实现本地启动,无需借助NFS。 第1步、生成rootfs根文件系统 这一步可参考我另一篇博客(如何使用busybox编译和生成最简linux根文件系统(rootfs))中的方法和步骤。如果想简单起见,也可直接下载我已经编译好的成果(mini2440最精简的rootfs文件系统)。里面的压包解开来就是一个rootfs根文件系统的全部目录,可以直接用于下一步的操作。 第2步、生成img镜像文件 这里我们按照友善之臂的官方推
[单片机]
玩转<font color='red'>mini2440</font>开发板之【编译烧录rootfs根文件系统全过程记录】
mini2440 uboot的使用经历
记录一下自己在mini2440上面 使用uboot的曲折的经历。 首先是使用了买板子时自带的代码: u-boot-1.1.6。但是编译时,总是提示有错误。也不知道这个版本是不是tekk的那个版本,自己修改了一些地方,但是感觉uboot的编译体系与一般的开源软件不相同,编译时,总是提示 有函数的实现找不到,即undefined reference to _,,,,网上说需要在makefile中添加 nostdlib等选项,但依然无法编译通过。 后来下载了 tekk的版本,貌似大家用的都是他的版本。 先说一下supervivi和uboot的区别。 在mini2440在norflash中烧写的是supervivi,sup
[单片机]
基于mini2440按键控制电子相册(裸机代码)
#define GLOBAL_CLK 1 #include def.h #include option.h #include 2440addr.h #include profile.h #define LCD_WIDTH 320 //屏幕宽度 #define LCD_HEIGHT 240 //屏幕高度 #define CLKVAL 4 //时钟信号 //垂直同步信号的脉宽、后肩和前肩 #define VSPW (2-1) #define VBPD (11-1) #define VFPD (5-1) //水平同步信号的脉宽、后肩和前肩 #define HSPW (2-1) #define HBPD (69-1)
[单片机]
mini2440 dm9000 网卡驱动详解 (二)
3. platform_driver的remove, suspend和resume的实现 remove函数的功能是把设备从内核中移除,释放内存区域。该函数在卸载模块时被调用。代码清单如下: static int __devexit dm9000_drv_remove(struct platform_device *pdev) { struct net_device *ndev = platform_get_drvdata(pdev); platform_set_drvdata(pdev, NULL); unregister_netdev(ndev); dm
[单片机]
<font color='red'>mini2440</font> dm9000 网卡驱动详解 (二)
LPC1768的usb使用--硬件
LPC1768芯片带有USB设备控制器,前面写的文章都是在说比较简单的设备驱动,今天来说复杂一点的 首先是硬件层的配置 #ifndef __USBHW_H__ #define __USBHW_H__ #include debugSerial.h #include usbreg.h #include usb.h #include usbuser.h #include usbcfg.h #include usbcore.h #include usbep1.h U32 EPAdr (U32 EPNum) ; //USB硬件寄存器级别的方法 extern void USB_Init(void
[单片机]
开发板与主机ping不通的解决方案(mini2440
方案:组建一个由windows、linux和开发板组成的局域网 1.准备工作 虚拟机使用桥接方式 用根网线将开发板和主机直接连接起来(不经过交换机) 关闭linux的防火墙: 关闭selinux: 关闭windows防火墙 断掉外网(无线) 2.ip设置 将linux的ip地址设置为静态ip:192.169.1.100 网关:192.169.1.1 设置子网掩码码为:255.255.255.0 执行下面命令更改文件内容和下面相同即可 设置静态ip详细步骤:http://jingyan.baidu.com/article/455a99508be7cda167277865.html 设置开发板的ip
[单片机]
开发板与主机ping不通的解决方案(<font color='red'>mini2440</font>)
MINI2440 按键输入子系统 驱动及测试代码分析
按键输入子系统驱动: #include linux/module.h #include linux/types.h #include linux/fs.h #include linux/mm.h #include linux/device.h #include linux/errno.h /* for -EBUSY */ #include linux/ioport.h /* for request_region */ #include linux/delay.h /* for loops_per_jiffy */ #include asm/io.h /* for inb_p, outb_p, inb, outb,
[单片机]
Windows下u-boot-2011.03在Mini2440移植详解(6)
Nor Flash启动 Nor Flash:SST39VF1601 ---2MB SDRAM: HY57V561620FTP-H,容量:256Mb(16M×16bit)=32MB,频率:133MHZ,开发板带2片* 32MB=64MB 前记: 关于这一步的移植花费了很大的时间。我们知道,在gdb调试时,是直接load代码到CONFIG_SYS_TEXT_BASE 所对应的SDRAM地址处,CONFIG_SYS_TEXT_BASE 在文件u-boot-2011.03boardsamsungmini2440config.mk中定义。假设CONFIG_SYS_TEXT_BASE=0x33000000,那么调试时就将ubo
[单片机]
Windows下u-boot-2011.03在<font color='red'>Mini2440</font>移植详解(6)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved