版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于嵌入式linux的数码相框详细设计说明书提交:八分之一组审核:核准:目录TOCHYPERLINK1目的 1HYPERLINK2项目背景 1二HYPERLINK术语及缩略语定义 2HYPERLINK3参考资料 2HYPERLINK3.1程序结构图 3HYPERLINK3.2MTD模块说明 33.2USB模块说明 8HYPERLINK3.4LED模块说明 12HYPERLINK\l"__RefHeading__95_713630697"四摄像头驱动程序详细设计 13HYPERLINK\l"__RefHeading__97_713630697"4.1摄像头驱动移植说明 13HYPERLINK\l"__RefHeading__99_713630697"4.2摄像头程序详细设计 13HYPERLINK\l"__RefHeading__95_713630697"五mjpegstream服务器模块设计13六主程序设计6.1主程序流程图146.2主程序设计156.3主程序详细代码设计16一引言1目的本系统结合嵌入式ARM开发板,LCD液晶屏,CAMERA摄像头的数码电子相框。用户可以通过U盘,SD卡或开发板自带nandflash等存储设备的插入查看存储介质内存储的图片文件;也可以通过系统自带的300万像素的摄像头实现拍摄照片,视频并在LCD屏幕上播放。面向的读者:项目经理,程序员,概要设计/详细设计说明书编写人员,测试人员其他读者。2项目背景项目名称:基于嵌入式linux的数码相框项目提出者:八分之一项目组项目开发者:八分之一项目组项目管理者:项目组长邢英豪最终用户:一般用户相关背景:随着数码相机的盛行,传统相机逐渐退出历史的舞台。对于数码相片的欣赏和摆设,人们一般只能通过PC机,极其不方便。数码相框正是迎合这种需求,它体积小,能随时更换相片,并具有USB主机功能,能够即插即用,拥有较大的存储空间。二术语及缩略语定义1术语定义数码相框:数码相框是可以直接展示数码照片不用将照片冲印出来再展示的新型相框。MTD设备:MTD内存技术设备是用于访问memory设备的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。USB设备:是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。Framebuffer设备:是用一个视频输出设备从包含完整的帧数据的一个内存缓冲区中来驱动一个视频显示设备。图像编码技术:图像编码也称图像压缩,是指在满足一定质量(信噪比的要求或主观评价得分)的条件下,以较少比特数表示图像或图像中所包含信息的技术。2缩略语定义MTD:(memorytechnologydevice内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。USB:UniversalSerialBus(通用串行总线)是一个外部总线标准,用于规范电脑与外部设备的连接和通讯3参考资料(1)<<Cprime&plus>>人民邮电出版社,2012年10月(2)<<嵌入式linux应用程序开发详解>>孙琼,人民邮电出版社,2006-07-01(3)<<linux设备驱动程序-第二版>>宋宝华,人民邮电出版社,2010年6月(4)<<深入理解linux内核>>(5)<<天嵌TQ210开发板参考资料>>三主控系统详细设计3.1程序结构图3.2MTD模块说明程序描述:MTD驱动程序名称:s3c_nand.c审核:日期:2015.11.5输入数据:输出数据:硬件描述:A/D转换器是模拟信号源和CPU之间联系的接口,它的任务是将连续变化的模拟信号转化为数字信号,以便计算机和数字系统使用。利用一个电位计输出电压到s5pv210的AIN0管脚。输入的电压范围是0~3.3V。对A/D模块中的寄存器进行操作,其中包括对ADC控制寄存器(ADCCON),ADC数据寄存器(ADCDAT)的读写操作。同时为了观察转换结果,可以通过串口调试助手里面观察ADC采集的电压值。原理图:详细代码设计#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include<linux/platform_device.h>#include<linux/interrupt.h>#include<linux/fs.h>#include<linux/clk.h>#include<linux/cdev.h>#include<linux/sched.h>#include<linux/device.h>#include<asm/io.h>#include<asm/uaccess.h>MODULE_LICENSE("DualBSD/GPL");#defineS5PV210_ADCCON 0x00#defineS5PV210_ADCDAT0 0x0C#defineS5PV210_ADCCLRINT 0x18#defineS5PV210_ADCMUX 0x1Cstructresource*res_mem,*res_irq;void__iomem*adc_base;dev_tdevno=0;structcdevadc_cdev;structclk*clk=NULL;structclass*my_class=NULL;structdevice*my_device=NULL;wait_queue_head_treadq;intflags=0;/*从设备中读取数据*/ssize_ts5pv210_adc_read(structfile*file,char__user*buf,size_tcount,loff_t*loff){ intdata; writel(1,adc_base+S5PV210_ADCMUX);//选择adc通道1 writel(1<<16|1<<14|0xff<<6|0<<2|1<<0,adc_base+S5PV210_ADCCON);//adc工作模式 wait_event_interruptible(readq,flags!=0);//利用等待队列机制,adc不可读则睡眠,在adc中断时唤醒进程 data=readl(adc_base+S5PV210_ADCDAT0)&0xfff;//进程醒来,读本次adc转换值 if(copy_to_user(buf,(char*)&data,sizeof(data)))//把adc值传给用户空间 return-EINVAL; returnsizeof(data);//返回:本次读取数据}/*打开设备*/ints5pv210_adc_open(structinode*inode,structfile*file){ return0;}/*关闭设备*/ints5pv210_adc_close(structinode*inode,structfile*file){ return0;}/*设备操作集合,结构中的成员指向驱动中的函数*/structfile_operationss5pv210_adc_fops={ .owner=THIS_MODULE,//一个指向拥有这个结构的模块的指针,用来在它的操作还在被使用时阻止模块被卸载 .open=s5pv210_adc_open, .release=s5pv210_adc_close, .read=s5pv210_adc_read};/*中断处理顶半部函数*/irqreturn_tadc_interrupt(intirqno,void*devid){ flags=1;//改变conditions成立 wake_up_interruptible(&readq);//唤醒等待队列 writel(0,adc_base+S5PV210_ADCCLRINT);//清除中断挂起标志 returnIRQ_HANDLED;}staticints5pv210_adc_probe(structplatform_device*pdev){ intresult; init_waitqueue_head(&readq); result=alloc_chrdev_region(&devno,0,1,"adc");//注册字符设备,动态申请设备号,请求内核动态分配1个设备号 if(result<0) { printk("Unablegetdevnumber\n"); return-1; } cdev_init(&adc_cdev,&s5pv210_adc_fops);//cdev_init()函数用于初始化cdev的成员,并建立cdev和file_operations之间的连接 adc_cdev.owner=THIS_MODULE; result=cdev_add(&adc_cdev,devno,1);//cdev_add()函数向系统添加一个cdev,完成字符设备的注册 if(result<0) { printk("Unableregistercdev\n"); gotoerr1; } clk=clk_get(NULL,"adc");//获得adc时钟控制结构体,并且打开adc时钟 if(clk==NULL) { result=-ENODEV; gotoerr2; } clk_enable(clk); res_mem=platform_get_resource(pdev,IORESOURCE_MEM,0);//获得platform_device里的第一个IORESOURCE_MEM资源 res_irq=platform_get_resource(pdev,IORESOURCE_IRQ,1);//获得platform_device里的第二个IORESOURCE_IRQ资源 if((res_mem==NULL)||(res_irq==NULL)) { result=-ENODEV; gotoerr3; } printk("memstart=0X%x,end=0X%x\n",res_mem->start,res_mem->end); printk("irqno=%d\n",res_irq->start); adc_base=ioremap(res_mem->start,res_mem->end-res_mem->start);//映射adc寄存器的物理地址为内核的虚拟地址 if(adc_base==NULL) { result=-ENOMEM; gotoerr3; } result=request_irq(res_irq->start,adc_interrupt,IRQF_DISABLED,"adc",NULL);//向内核申请adc中断资源,注册adc中断处理函数顶半部 if(result<0) { gotoerr4; } my_class=class_create(THIS_MODULE,"adc_class");//创建设备类 if(IS_ERR(my_class)) { result=PTR_ERR(my_class); gotoerr5; } my_device=device_create(my_class,NULL,devno,NULL,"adc");//创建设备节点 if(IS_ERR(my_device)) { result=PTR_ERR(my_device); gotoerr6; } printk("platform:matchok!\n"); return0;err6: class_destroy(my_class);err5: free_irq(res_irq->start,NULL);err4: iounmap(adc_base); err3: clk_disable(clk); clk_put(clk);err2: cdev_del(&adc_cdev);err1: unregister_chrdev_region(devno,1); returnresult;}/*设备移除*/staticints5pv210_adc_remove(structplatform_device*pdev){ device_destroy(my_class,devno);//删除设备节点 class_destroy(my_class);//删除类 clk_disable(clk);//禁止adc时钟,释放adcclk clk_put(clk); cdev_del(&adc_cdev);//删除cdev unregister_chrdev_region(devno,1);//注销设备号 iounmap(adc_base);//释放虚拟地址 free_irq(res_irq->start,NULL);//释放中断资源 printk("platform:driverremove\n"); return0;}structplatform_drivers5pv210_adc_driver={ .probe=s5pv210_adc_probe, .remove=__devexit_p(s5pv210_adc_remove), .driver={ .name="s3c64xx-adc", },};/*设备驱动模块加载函数*/staticint__inits5pv210_platform_init(void){ platform_driver_register(&s5pv210_adc_driver);//注册platform_driver printk("platform:driverinstalled\n"); return0;}/*设备驱动模块卸载函数*/staticvoid__exits5pv210_platform_exit(void){ platform_driver_unregister(&s5pv210_adc_driver);//注销platform_driver printk("platform:driveruninstalled!\n");}module_init(s5pv210_platform_init);module_exit(s5pv210_platform_exit);3.3USB模块说明usb驱动编码:S5PV210_usb.c编写:孙家昌日期:2015.11.4键盘测试编码审核:日期:2015.11.4 功能描述:当usb设备插入开发板后,开发板能够读取usb设备中的内容。处理流程:拷贝ohci.h到arch/arm/mach-s5pv210/include/mach/目录下拷贝usb-phy.h到arch/arm/mach-s5pv210/include/mach/目录下拷贝setup-usb-phy.c到arch/arm/mach-s5pv210/目录下拷贝regs-otg.h到arch/arm/plat-samsung/include/plat/目录下拷贝ohci-exynos.c到drivers/usb/host/目录下修改drivers/usb/host/ohci-hcd.c在#ifdefCONFIG_USB_OHCI_HCD_OMAP1#include"ohci-omap.c"#defineOMAP1_PLATFORM_DRIVER ohci_hcd_omap_driver#endif上边添加如下代码:#ifdefCONFIG_ARCH_S5PV210#include"ohci-exynos.c"#definePLATFORM_DRIVER exynos_ohci_driver#endif修改drivers/usb/Kconfig在 defaultyifARCH_S3C2410下添加:defaultyifARCH_S5PV210修改arch/arm/mach-s5pv210/Kconfig在configS5PV210_SETUP_I2C1 bool help Commonsetupcodefori2cbus1.下面添加如下代码:configS5PV210_SETUP_USB_PHY bool help CommonsetupcodefortheUSBPHYcontroller在configMACH_SMDKV210 bool“SMDKV210”下添加: selectS5P_DEV_USB_OHCI selectS5PV210_SETUP_USB_PHY修改arch/arm/plat-s5p/Kconfig在configS5P_DEV_USB_EHCI bool help CompileinplatformdevicedefinitionforUSBEHCI下添加如下代码:configS5P_DEV_USB_OHCI bool help CompileinplatformdevicedefinitionforUSBOHCI修改arch/arm/mach-s5pv210/Makefile在文件最后添加obj-$(CONFIG_S5PV210_SETUP_USB_PHY) +=setup-usb-phy.o修改arch/arm/mach-s5pv210/include/mach/map.h:添加如下代码:#defineS5PV210_PA_OHCI 0xEC300000#defineS5P_PA_OHCI S5PV210_PA_OHCI #defineS5P_SZ_OHCI SZ_1M修改arch/arm/plat-samsung/include/plat/map-base.h:添加如下代码:#defineS3C_VA_OTGS3C_ADDR(0x00E00000)#defineS3C_VA_OTGSFRS3C_ADDR(0x00F00000)修改平台代码arch/arm/mach-s5pv210/mach-smdkv210.c:添加头文件:#include<mach/ohci.h>#include<mach/usb-phy.h>添加如下代码:staticstructmap_descs5pv210_iodesc[]__initdata={ { .virtual =(unsignedlong)S3C_VA_OTG, .pfn =__phys_to_pfn(S5PV210_PA_HSOTG), .length =SZ_1M, .type =MT_DEVICE, },{ .virtual =(unsignedlong)S3C_VA_OTGSFR, .pfn =__phys_to_pfn(S5PV210_PA_HSPHY), .length =SZ_1M, .type =MT_DEVICE, },};修改:s5p_init_io(NULL,0,S5P_VA_CHIPID);为:s5p_init_io(s5pv210_iodesc,ARRAY_SIZE(s5pv210_iodesc),S5P_VA_CHIPID);添加代码:/*USBOHCI*/staticstructs5p_ohci_platdatas5pv210_ohci_pdata;staticvoid__inits5pv210_ohci_init(void){ structs5p_ohci_platdata*pdata=&s5pv210_ohci_pdata; s5p_ohci_set_platdata(pdata);}/*USBOHCIHostControllerregistration*/staticstructresources5p_ohci_resource[]={ [0]={.start=S5P_PA_OHCI,.end=S5P_PA_OHCI+S5P_SZ_OHCI-1, .flags =IORESOURCE_MEM, }, [1]={ .start =IRQ_UHOST, .end =IRQ_UHOST, .flags =IORESOURCE_IRQ, }};staticu64s5p_device_ohci_dmamask=0xffffffffUL;structplatform_devices5p_device_ohci={ .name ="s5p-ohci", .id =-1, .num_resources =ARRAY_SIZE(s5p_ohci_resource), .resource =s5p_ohci_resource, .dev ={ .dma_mask=&s5p_device_ohci_dmamask, .coherent_dma_mask=0xffffffffUL }};void__inits5p_ohci_set_platdata(structs5p_ohci_platdata*pd){ structs5p_ohci_platdata*npd; npd=s3c_set_platdata(pd,sizeof(structs5p_ohci_platdata), &s5p_device_ohci); if(!npd->phy_init) npd->phy_init=s5p_usb_phy_init; if(!npd->phy_exit) npd->phy_exit=s5p_usb_phy_exit; if(!npd->port_status) npd->port_status=s5p_usb_host_port_status;}在机构体数组smdkv210_devices[]中添加&s5p_device_ohci,在函数smdkv210_machine_init中添加s5pv210_ohci_init();配置内核makemenuconfigSCSIdevicesupport> <*>SCSIdevicesupport <*>SCSIdisksupport <*>SCSIgenericsupport[*]USBsupport> <*>SupportforHost-sideUSB <*>OHCIHCDsupport <*>USBMassStoragesupport 编译内核并拷贝到tftpboot下$makezImage$cparch/arm/boot/zImage/tftpboot 测试启动目标板并在目标板上完成如下操作:插入U盘显示如下usb1-1.4:newfull-speedUSBdevicenumber5usings5p-ohciscsi2:usb-storage1-1.4:1.0scsi2:0:0:0:Direct-AccessaigoMiniking8.07PQ:0ANSI:2sd2:0:0:0:Attachedscsigenericsg0type0sd2:0:0:0:[sda]7886848512-bytelogicalblocks:(4.03GB/3.76GiB)sd2:0:0:0:[sda]WriteProtectisoffsd2:0:0:0:[sda]NoCachingmodepagepresentsd2:0:0:0:[sda]Assumingdrivecache:writethroughsd2:0:0:0:[sda]NoCachingmodepagepresentsd2:0:0:0:[sda]Assumingdrivecache:writethroughsda:sda1(这里显示的内容是设备与分区)sd2:0:0:0:[sda]NoCachingmodepagepresentsd2:0:0:0:[sda]Assumingdrivecache:writethroughsd2:0:0:0:[sda]AttachedSCSIremovablediskusb1-1.4:newfull-speedUSBdevicenumber5usings5p-ohci在终端上执行挂载的设备与上边显示相关#mount-tvfat/dev/sda1/mnt#ls可以查看到U盘内容。3.4frambuffer模块说明程序描述:frambuffer驱动程序名称:mach-smdkv210.c审核:日期:2015-10-8件描述:一幅图像的显示过程是这样的:用户打开/dev/fbx设备,使用mmap()系统调用映射framebuffer内存空间到用户空间,用户直接用memcpy()复制图像数据到framebuffer,DMA探测到framebuffer数据发生变动,启动DMA传输图像数据到IPUI,PU再根据framebuffer驱动设置的处理模式对像素数据进行一系列处理,比如framebuffer使用了overlayframebuffer那就启动overlay处理单元混合两个framebuffer的数据,另外IPU还会packing像素数据,比如framebuffer里像素格式为RGB565,IPU会把他packing成RGB666的格式,以配合LCD模块的接口。IPU处理完数据后,送到DI,在DI时序模块产生的时序信号同步下,一起输出到LCD驱动芯片。原理图: 驱动程序设计:时序信号一般是根据LCD的datasheet上的参数,填写fb_videomode这个结构体:structfb_videomode{constchar*name;/*optional*/u32refresh;/*optional*/u32xres;//x分辨率u32yres;//y分辨率u32pixclock;//像素时钟频率,即每个时钟周期显示一个像素点u32left_margin;//行扫描开始脉冲到一行像素数据开始输出的延迟hsync<==>DENu32right_margin;//一行像素数据输出完毕到下一行的行扫描开始脉冲间的延迟DEN<==>hsyncu32upper_margin;//帧扫描开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030智慧农业行业市场现状分析及投资筹备规划研究报告
- 2025-2030智慧农业行业市场机遇挖掘与挑战应对投资评估规划分析研究报告
- 2025-2030智慧农业行业市场分析及发展趋势与管理策略研究报告
- 2025-2030智慧农业物联网集成本土资源利用率综合效益分析发展报告
- 2025-2030智慧农业物联网技术应用市场分析及产业链整合发展潜力研究报告
- 皮革专业园区厂房建设项目商业计划书
- 危险品安全负责人考试题库及答案解析
- 新能源汽车轻量化一体化项目投资计划书
- 2022北京东直门中学高一9月月考数学(教师版)
- 银行从业资格考试个人理财模拟及答案解析
- 2025年中国水处理用絮凝剂和凝聚剂行业市场分析及投资价值评估前景预测报告
- 2025年内蒙古公职人员考试时事政治考试试题(附含答案)
- 公安机房运维知识培训课件
- 《基层常见病诊疗指南》
- 2025年及未来5年中国专用灯具行业市场调研及投资战略研究报告
- 2025年新版中国移动笔试题库及答案
- 2025年湖北省生态环保有限公司招聘33人笔试参考题库附带答案详解
- 集装箱驾驶员管理制度
- 第八章健美操健美操组合动作教学设计人教版初中体育与健康八年级全一册
- 4.11五四运动课件-统编版八年级历史上册
- 肿瘤患者中心静脉血管通路装置相关皮肤损伤临床护理实践指南 2
评论
0/150
提交评论