s5pv210 fimc 之 fimc-dev.c

发布者:知识智慧最新更新时间:2024-12-16 来源: cnblogs关键字:s5pv210 手机看文章 扫描二维码
随时随地手机看文章

fimc-dev.c 是Samsung FIMC 设备的V4L2 驱动。上层应用直接操作这个设备,进行capture,图片处理,以及overlay输出


http://blog.csdn.net/cxw3506/article/details/8476263


43 int fimc_dma_alloc(struct fimc_control *ctrl, struct fimc_buf_set *bs,  

 44                             int i, int align)  

 45 {  

 46     dma_addr_t end, *curr;  

 47  

 48     mutex_lock(&ctrl->alloc_lock);  

 49  

 50     end = ctrl->mem.base + ctrl->mem.size;  

 51     curr = &ctrl->mem.curr;  

 52  

 53     if (!bs->length[i])  

 54         return -EINVAL;  

 55  

 56     if (!align) {  

 57         if (*curr + bs->length[i] > end) {  

 58             goto overflow;  

 59         } else {  

 60             bs->base[i] = *curr;  

 61             bs->garbage[i] = 0;  

 62             *curr += bs->length[i];  

 63         }  

 64     } else {  

 65         if (ALIGN(*curr, align) + bs->length[i] > end)  

 66             goto overflow;  

 67         else {  

 68             bs->base[i] = ALIGN(*curr, align);  

 69             bs->garbage[i] = ALIGN(*curr, align) - *curr;  

 70             *curr += (bs->length[i] + bs->garbage[i]);  

 71         }  

 72     }  

 73  

 74     mutex_unlock(&ctrl->alloc_lock);  

 75  

 76     return 0;  

 77  

 78 overflow:  

 79     bs->base[i] = 0;  

 80     bs->length[i] = 0;  

 81     bs->garbage[i] = 0;  

 82  

 83     mutex_unlock(&ctrl->alloc_lock);  

 84  

 85     return -ENOMEM;  

 86 }  

这个函数很简单,之所以提出来说下,是因为我在DMA对齐问题上卡了一个多星期


FIMC使用预分配的物理内存来申请DMA buffer,参数中的align指明申请buffer的对齐方式,对于FIMC capture来说,似乎output DMA要求4k对齐(尽管我没有在datasheet中找到),如果给定的DMA地址没有4K对齐,FIMC DMA控制器会很聪明的从4K对齐的地址开始传送数据,这会导致了帧数据偏移。


@i 参数指定了plane数,FIMC 输出支持很多种格式,有单层的比如YUYV,两层的V4L2_PIX_FMT_NV12,还有三层的V4L2_PIX_FMT_NV12T


单层格式输出申请一个buffer,两层格式输出申请两个buffer,三层则需申请三个buffer。


 


 88 void fimc_dma_free(struct fimc_control *ctrl, struct fimc_buf_set *bs, int i)  

 89 {  

 90     int total = bs->length[i] + bs->garbage[i];  

 91     mutex_lock(&ctrl->alloc_lock);  

 92   

 93     if (bs->base[i]) {  

 94         if (ctrl->mem.curr - total >= ctrl->mem.base)  

 95             ctrl->mem.curr -= total;  

 96   

 97         bs->base[i] = 0;  

 98         bs->length[i] = 0;  

 99         bs->garbage[i] = 0;  

100     }  

101   

102     mutex_unlock(&ctrl->alloc_lock);  

103 }  


这个函数有问题,93 ~ 95 成立的条件是bs->base[i]所占的地址必须在ctrl->mem.base最后面,这就要求释放顺序必须从bs的最后一个节点向前释放。


 


655 static inline int fimc_mmap_cap(struct file *filp, struct vm_area_struct *vma)  

656 {  

657     struct fimc_prv_data *prv_data =  

658                 (struct fimc_prv_data *)filp->private_data;  

659     struct fimc_control *ctrl = prv_data->ctrl;  

660     u32 size = vma->vm_end - vma->vm_start;  

661     u32 pfn, idx = vma->vm_pgoff;  

662   

663     vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);  

664     vma->vm_flags |= VM_RESERVED;  

665   

666     /* 

667      * page frame number of the address for a source frame 

668      * to be stored at. 

669      */  

670     pfn = __phys_to_pfn(ctrl->cap->bufs[idx].base[0]);  

671   

672     if ((vma->vm_flags & VM_WRITE) && !(vma->vm_flags & VM_SHARED)) {  

673         fimc_err('%s: writable mapping must be sharedn', __func__);  

674         return -EINVAL;  

675     }  

676   

677     if (remap_pfn_range(vma, vma->vm_start, pfn, size, vma->vm_page_prot)) {  

678         fimc_err('%s: mmap failn', __func__);  

679         return -EINVAL;  

680     }  

681   

682     return 0;  

683 }  

fimc capture 设备的mmap实现,ctrl->cap->bufs[idx]是fimc capture设备申请的buffer,mmap就是把这个buffer映射到应用程序空间


661 vma->vm_pgoff 表示vm_file内以PAGE_SIZE为单位的偏移,但是在这里应用层和内核使用另外一种约定的含义,buffer ID, 应用层调用mmap接口对fimc capture设备的buffer进行映射


 


700 static u32 fimc_poll(struct file *filp, poll_table *wait)  

701 {  

702     struct fimc_prv_data *prv_data =  

703                 (struct fimc_prv_data *)filp->private_data;  

704     struct fimc_control *ctrl = prv_data->ctrl;  

705     struct fimc_capinfo *cap = ctrl->cap;  

706     u32 mask = 0;  

707   

708     if (cap) {  

709         if (cap->irq || (ctrl->status != FIMC_STREAMON)) {  

710             mask = POLLIN | POLLRDNORM;  

711             cap->irq = 0;  

712         } else {  

713             poll_wait(filp, &ctrl->wq, wait);  

714         }  

715     }  

716   

717     return mask;  

718 }  


fimc_poll向上层应用提供了等待机制,应用程序poll fimc设备并阻塞,直到cap或者output中断处理函数唤醒


 


732 u32 fimc_mapping_rot_flip(u32 rot, u32 flip)  

733 {  

734     u32 ret = 0;  

735   

736     switch (rot) {  

737     case 0:  

738         if (flip & FIMC_XFLIP)  

739             ret |= FIMC_XFLIP;  

740   

741         if (flip & FIMC_YFLIP)  

742             ret |= FIMC_YFLIP;  

743         break;  

744   

745     case 90:  

746         ret = FIMC_ROT;  

747         if (flip & FIMC_XFLIP)  

748             ret |= FIMC_XFLIP;  

749   

750         if (flip & FIMC_YFLIP)  

751             ret |= FIMC_YFLIP;  

752         break;  

753   

754     case 180:  

755         ret = (FIMC_XFLIP | FIMC_YFLIP);  

756         if (flip & FIMC_XFLIP)  

757             ret &= ~FIMC_XFLIP;  

758   

759         if (flip & FIMC_YFLIP)  

760             ret &= ~FIMC_YFLIP;  

761         break;  

762   

763     case 270:  

764         ret = (FIMC_XFLIP | FIMC_YFLIP | FIMC_ROT);  

765         if (flip & FIMC_XFLIP)  

766             ret &= ~FIMC_XFLIP;  

767   

768         if (flip & FIMC_YFLIP)  

769             ret &= ~FIMC_YFLIP;  

770         break;  

771     }  

772   

773     return ret;  

774 }  


rot会影响flip的结果,该函数映射(合并)rot和 flip操作


 


static int fimc_open(struct file *filp)  

{  

    struct fimc_control *ctrl;  

    struct s3c_platform_fimc *pdata;  

    struct fimc_prv_data *prv_data;  

[1] [2] [3]
关键字:s5pv210 引用地址:s5pv210 fimc 之 fimc-dev.c

上一篇:s5pv210移植Minigui3.0.12
下一篇:X210(s5pv210)中断系统

推荐阅读最新更新时间:2026-03-13 22:29

icache_设置栈调用C函数_S5PV210
start.S文件中: //#define CONFIG_SYS_ICACHE_OFF .global _start _start: // 关闭看门狗 ldr r0, =0xE2700000 //在s5pv210手册中0xE270_0000是看门狗寄存器的地址 mov r1, #0 str r1, // 打开icache可提高运行速度 #ifdef CONFIG_SYS_ICACHE_OFF // clear bit 12 (I) I-cache bic r0, r0, #0x00001000 //bic:逻辑与非 //在s3c2410英文手册
[单片机]
S5PV210开发 -- I2C 你知道多少?(一)
网上的资料很多,但是大多讲解的不太全面。如果只是单纯的讲一下I2C总线协议,那就没必要再写了。因为MPU6050 开发部分已经将 I2C 通信协议,讲的很清楚了。但是I2C设备驱动、上拉电阻取值、设备地址、电路设计、I2C仲裁、Linux下配置等都还没细讲。So,这篇文章的目的应该是讲一种方法,以后遇到I2C设备知道从哪入手。接下来主要以AT24C02、MT9P031、MPU6050 为例,展开对I2C最后的总攻。 一、概述 参看:I2C -- 维基百科 I2C(Inter-Integrated Circuit)字面上的意思是集成电路之间,它其实是I2C Bus简称,所以中文应该叫集成电路总线,它是一种串行通信总线(同步、
[单片机]
<font color='red'>S5PV210</font>开发 -- I2<font color='red'>C</font> 你知道多少?(一)
S5PV210 点亮Led
GPC1CON, R/W, Address = 0xE020_0080 GPC1DAT, R/W, Address = 0xE020_0084 举例 #define GPC1CON *((volatile unsigned int*)0xE0200080) #define GPC1DAT *((volatile unsigned int*)0xE0200084) *(unsigned int*)GPC1CON &= ~(0xf 12); *(unsigned int*)GPC1CON |= (0x1 12); *(unsigned int*)GPC1DAT &= ~(0x1 3); *(un
[单片机]
<font color='red'>S5PV210</font> 点亮Led
QT开发之移植qt5.6.2到S5PV210
1、移植前的准备工作  (1)确认已经烧录uboot,并设置环境变量bootcmd和bootargs从tftp、nfs启动;  (2)zImage事先编译好的,文件夹形式的rootfs准备好,成功启动内核进入命令行;  (3)ts驱动源码确认添加、设备文件确认OK(dev/input/event2)(cat dev/input/event2 点击触摸屏有乱码打印出来); 2、tslib移植和测试  (1)源码下载  (2)解压 tar -xvf tslib-1.4.tar.gz  (3)配置 cd tslib ./autogen.sh echo ac_cv_func_malloc_0_nonn
[单片机]
wince 5.0/wince6.0 2440/6410/S5PV210 触摸屏驱动 滤波函数的介绍
以前曾经遇到过wince 手持机,POS机触摸屏 抖动,跳点,飞点的问题,其中起作用最大的就是触摸屏滤波函数,现在给大家介绍一下。 //----------------------------------------------------------------------------- //--函数介绍:触摸屏滤波函数,每次输入一个采集到的触摸屏点(x/y),然后进行滤波 //------------------------------------------------------------------------------ static BOOL Touch_Pen_Filtering(INT *px, INT *py
[单片机]
【ARM裸机s5pv210 】程序烧录
1.SD卡刷uboot   准备工作   (1)securcrt(115200,数据流控制全不选)   (2)usb转串口驱动   (3)破坏iNand中的bootloader已从SD2启动   (4)九鼎x210_fusingtool.exe   (5)准备好的uboot.bin   流程   (1)使用x210_fusingtool将uboot.bin刷入SD卡   (2)板子启动方式选择emmc启动   板子启动流程   开机- 读iNand的uboot失败 - 读SD卡uboot成功 - 运行nandflash中的系统 2.用fastboot刷机   准备工作   (1)OTG数据线,禁用数字签名   (2)fastboo
[单片机]
【ARM裸机s5pv210 】时钟配置
clock.c // 时钟控制器基地址 #define ELFIN_CLOCK_POWER_BASE 0xE0100000 // 时钟相关的寄存器相对时钟控制器基地址的偏移值 #define APLL_LOCK_OFFSET 0x00 #define MPLL_LOCK_OFFSET 0x08 #define APLL_CON0_OFFSET 0x100 #define APLL_CON1_OFFSET 0x104 #define MPLL_CON_OFFSET 0x108 #define CLK_SRC0_OFFSET 0x200 #define CL
[单片机]
【ARM裸机s5pv210 】芯片初始化
#define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 #define WTCON 0xE2700000 #define SVC_STACK 0xd0037d80 .global _start _start: // 第1步:关看门狗(向WTCON的bit5写入0即可) ldr r0, =WTCON ldr r1, =0x0 str r1, // 第2步:设置SVC栈    满减栈,满的意思是入栈先移动指针再填入数据,减的意思是栈从高到低用 ldr sp, =SVC_STACK // 第3步:开/关icache
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved