摄像头驱动
一些概念:
摄像接口的主时钟信号由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寄存器MWCMD或MRCMD赋予数据端口,这样就指定了SRAM中的某个地址,而且在传输完一个数据后,指针会指向SRAM中的下一个地址,然后完成了接连拜访数据的意图。
根据ARP协议的DM9000编写过程:
初始化EINT7中止,设置中止函数进口
由于DM9000的数据中止引脚INT是连接到s3c2440的外部中止7引脚上的
编写好读和写DM9000寄存器函数,用其装备DM9000的寄存器
并使其用中止方法接纳网卡数据,查询方法发送数据
(这步挺难的,许多寄存器要装备,对照着Datasheet和他人的程序)
注:DM9000内的寄存器的地址宏界说时,不必管基址,直接按OFFSET界说
编写好DM9000发送和承受函数(位宽为16)
分别把DM9000寄存器MWCMD或MRCMD赋予数据端口
承受数据时要留意,依照规则的格局来编写
界说一个契合ARP协议格局的数组,用于数据传输
将该数组作为发送函数形参发给PC机恳求包
编写中止函数,清屏蔽
将接纳函数中的数组内容,用串口打印出操控台
SD卡驱动
SD(全名为Secure Digital Memory Card,安全数码卡)
s3c2440集成了SD操控器,能够方便地读写SD、MMC和对SDIO进行操作。
能够用SDIO操控器来编,也可用SPI总线来编
SDIO的运用是未来嵌入式体系最重要的接口技能之一,会替代现在GPIO式的SPI接口
详细的CMD指令和协议内容自己看回材料了。
我运用的SD卡为手机的内存卡(不是MMC),型号为SDHC_V20_CARD,支撑PLV2.0协议
主要讲编写简略的SD读写过程:
预备作业,编写要运用到一堆东西:
查看SDIO指令发送,接纳是否完毕函数Chk_CMD_End(int cmd, int be_resp)
运用到的CMD和ACMD函数(这部分要装备寄存器,要查值,比较难,参阅他人的吧)
编写一个要用的结构体SD_STRUCT,用于记载cCardType和iCardRCA等
SD卡辨认形式:
初始化:时钟400K,Type B, clk enable,SD卡形式,FIFO reset
CMD 0——》reset指令
CMD 8——》作业电压规模,初始化SDHC卡,看是否支撑PLV2.0,回来类型
CMD 55——》RCA为0x0,运用ACMD41前有必要运用
ACMD 41——》辨认卡能否在给定的VDD下作业
CMD 2——》查卡的CID信息
CMD 3——》要求体系给SD卡发送一个新相对地址RCA
改时钟频率:25M,预备进入transfer状况
CMD 7——》进入transfer状况
ACMD 6——》设置总线宽度为4bit
数据传输形式:
若需求擦除:
{
CMD 32——》start address
CMD 33——》end address
CMD 38——》erase
}留意:擦除后有必要要进行复位,即从头初始化前面过程,否则不能进行读写
单块写或多块写
CMD 7——》transfer形式
单块读或多块读
拓宽:
将摄像头捕捉的图画,写进SD卡中,然后再复原显现出来
留意一个点:
便是要将LCD_BUFFER[480][272]的二维数组转化为LCD_BUFFER_SD[480*272]一维
一个疑问?如同只需51200就可将整幅图画都显现出来,而不需求480*272那么多
附加部分(有空研讨):
文件体系的构建:
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/255301.html