2440裸机学习心得(下)
一些概念:
摄像接口的主时钟信号由USB PLL产生,它的频率为96MHz,再经过分频处理后输出给摄像头,摄像头再根据该时钟信号产生三个同步时钟信号(像素时钟、帧同步时钟和行同步时钟),反过来再输入回s3c2440。
OV9650内部有大量的寄存器需要配置,这就需要另外的数据接口。
OV9650的数据接口称为SCCB(串行摄像控制总线),它由两条数据线组成:一个是用于传输时钟信号的SIO_C,另一个是用于传输数据信号的SIO_D。SCCB的传输协议与IIC的极其相似,只不过IIC在每传输完一个字节后,接收数据的一方要发送一位的确认数据,而SCCB一次要传输9位数据,前8位为有用数据,而第9位数据在写周期中是Don’t-Care位(即不必关心位),在读周期中是NA位。SCCB定义数据传输的基本单元为相(phase),即一个相传输一个字节数据。
SCCB只包括三种传输周期,即3相写传输周期(三个相依次为设备从地址,内存地址,所写数据),2相写传输周期(两个相依次为设备从地址,内存地址)和2相读传输周期(两个相依次为设备从地址,所读数据)。当需要写操作时,应用3相写传输周期,当需要读操作时,依次应用2相写传输周期和2相读传输周期。(这些读写和IIC一样~)
OV9650有两个只读寄存器——0x1C和0x1D,用于存放厂家ID,数据分别为0x7F和0xA2,我们可以通过读取它们来判断s3c2440是否连接了OV9650。当确认连接了OV9650后,我们就可以把VGA(640×480)模式下YUV彩色空间的配置数组写入OV9650内(二维数组:第一个表示寄存器地址,第二个表示要写入的数据)
注意比较三个变量的含义:
Width = 640 //源宽度
PrDstWidth =480 //目标宽度
SrcWidth =640-WinHorOffset*2; //偏移后宽度
驱动函数编写步骤:
外围基础准备硬件初始化
IIC初始化,LCD初始化,UPLL时钟初始化(96M,0V9650系统时钟),
GPIO初始化(GPJ),硬件和软件复位摄像头(GPJ12为CAMERARESET,rCIGCTRL)
0V9650寄存器配置
A、读取OV9650厂商ID,验证是否工作
B、复位所有OV9650寄存器
C、配置OV9650寄存器(用规定的二维数组直接配)
摄像头接口初始化
摄像头接口的一些寄存器初始化:rCIGCTRL,rCIWDOFSTrCISRCFMT
rCIPRTRGFMT,rCIPRTAREA
B、设置内存首地址为LCD缓存数组首地址:rCIPRCLRSA1~4
C、计算水平和垂直缩放比率和位移量,以及主水平、垂直比率
放入以下三个寄存器中rCIPRSCPRERATIO,rCIPRSCPREDSTrCIPRSCCTRL
中断函数开启和指向
控制台菜单的编写与实现
显示视频
rCIPRSCCTRL|=(1<15); //预览缩放开启
rCIIMGCPT =(1<31)|(1<29); //预览缩放捕捉使能
截图,定格
rCIPRSCCTRL &=~(1<15); //预览缩放关闭
rCIIMGCPT &=~((1<31)|(1<29)); //预览缩放捕捉不使能
视频定格后,LCD_BUFFER数组就是图像数据
放大,缩小
调节偏移量HOffset,VOffset,每次改变后重新初始化摄像头接口
四个额外写出需注意的函数:
1、计算主突发长度和剩余突发长度CalculateBurstSize
2、/计算预缩放比率及移位量CalculatePrescalerRatioShift
3、中断函数(只清中断,不干别的) camera_interrupt
4、SCCB总线函数的读写(像IIC)Rd_SCCB,Wr_SCCB
网卡驱动
DM9000的一些基本概念:
DM9000对外来说只有两个端口——地址口和数据口,地址口用于输入内部寄存器的地址,而数据口则完成对某一寄存器的读写。DM9000的CMD引脚用来区分这两个端口,当CMD引脚为0时,DM9000的数据线上传输的是寄存器地址,当CMD引脚为1时,传输的是读写数据。
我们把DM9000的A8和A9接为高电平,把A4~A7接为低电平,并且把DM9000的AEN接到s3c2440的nGCS4引脚上,则DM9000的端口基址为0x20000300,如果再把DM9000的CMD引脚接到s3c2440的ADDR2引脚上0x20000304(怎么计算?)
查了一下书,是和存储控制器有关系,每个nGCSx对应128M地址空间,8个nGCSx对应1G地址。
nGCS4刚好对应0x20000000开始的地址,但为什么是0x20000300?
再加上IObase:300
如果将DM9000的CMD引脚接到s3c2440的ADDR2,由于CMD引脚的高低电平决定地址口和数据口,那么,ADDR2为0时,访问的
就是地址口,所以地址口的起始地址为ARRD2为0的情况,即0x20000000;ADDR2为1时,(LADDR3~LADDR0 = 0100)访问的就是数
据口,所以数据口的地址即0x20000004。
如果要写入DM9000中的某个寄存器,则先把该寄存器的地址赋予DM_ADDR_PORT,然后再把要写入的数据赋予DM_DATA_PORT即可。读取DM9000中的某个寄存器也类似。
DM9000寄存器介绍在数据手册11页开始:
DM9000内部有0x3FF大小的SRAM用于接受和发送数据缓存。在发送或接收数据包之前,数据是暂存在这个SRAM中的。当需要连续发送或接收数据时,我们需要分别把DM9000寄存
2440v裸机学 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)