Linux 下使用s3c6410的post处理器的进行硬件缩放

发布者:Blissful444最新更新时间:2024-11-05 来源: cnblogs关键字:Linux  s3c6410 手机看文章 扫描二维码
随时随地手机看文章

 在嵌入式下,在移植软件时经常会碰到这样的问题,就是显示分辩率的变化.一般软件往往针对桌面机的环境编译没有太多问题,但是在嵌入式环境下,受限的LCD显示有着很大的问题.

  这种情况下,一种方法是修改代码,让其在嵌入式的LCD上显示.另外一种是使用软件进行显示缩放. 这两个方法只在部分条件有效,而且修改的工作量极大,更多情况是无法修改,比如SDL下的Dosbox是针对 640*480,修改源码的分辩率成 480*272 后,基本屏幕显示完全错位.软件无法正常运行.

 这里有一种思路是使用s3c6410的post process.它是一个硬件进行图像和视频缩放的的模块.用POST后,只需要简单调整frame buffer显示库代码,即可以让原来无法移植的软件在嵌入式环境下自由缩放.

 一.Post Process 说明

   s3c6410的Post Process支持图像和视频缩放和格式转换,因为是硬件操作,所以速度非常之快.

  这是DataSheet 对其功能说明.

  •  Dedicated DMA with offset address 

• 3 Channel scaling pipelines for video/graphic scaling up/down or zooming in/out 

• Video input format: 420, 422 format 

• Graphic input format: 16-bit (565format) or 24-bit 

• Graphics Output format to Memory: 16-bit (565 format) / 24-bit graphic data (progressive only) 

• Video Output format to Memory: YCbCr420, YCbCr422 

• Output format to external FIFO: YCbCr444 / RGB (30-bit) for interlace and progressive 

• FreeRun Mode Operation  

• Programmable source image size up to 4096 × 4096 resolution 

• Programmable destination image size up to 2048 × 2048 resolution 

• Programmable scaling ratio 

• Format conversion for video signals 

• Color space conversion from YCbCr to RGB 

• Color Space conversion from RGB to YCbCr  

  它的主要处理流程是在系一种统内存中开辟一个PP的帧内存.其中数据被PP处理后,有两个流向,一个是通过DMA直接传到例如显存当中,这样可以直接显示,另外一种是传到硬件队列当中,然后可以发送到LCD,TV等设备当中.

  

   

 二.官方的Linux PP测试程序.

  

  官方有一个Linux下的测试程序,是演示的如果使用Post Process的驱动 s3c-pp的演示代码.它是用双缓冲的把两幅640*480的原始图像,在任意分辩率下进行缩放后,交替在屏幕上显示.

   

  这里有两个版本,我选择是 Multimedia_DDPP_V2.5v3.xxpp_app 的测试程序.

  我是在4.3'的s3c6410开发板上运行.fb的信息是 480*272 bpp采用16.

  这样需要对原有的代码post_test.c进行简单修改.

  

  1.23行,设备结点修改为 #define PP_DEVICE_FILE_NAME '/dev/s3c-pp'

  2. 25,26行,分辩率修改为4.3'的配置

     #define LCD_WIDTH  480

     #define LCD_HEIGHT  272

  Makefile 的修改,将CC=....的值调整为 CC=arm-linux-gcc

  编译成功后,可以选择如下两种方式运行.

    ./post_test 0 10000

   其中第一个参数是PP的输出方式,0是采用DMA输出,1是采用FIFO,两种情况测试均成功.

   第二个参数是两幅图像交错显示时,每次显示的时间.单位是微秒.

这是在我的开发板显示效果,结果是比较令人满意.

   

     

    

   

 三.封装后的S3C PP 库代码

   

   分析后的PP处理流程.官方只给一个简单中测试程序.简单分析其处理机制,大体按如下流程进行处理.

   1.打开/dev/s3c-pp结点进行操作

   2.对PP的设备使用ioctl命令 ioctl(pp_dev->pp_fd, S3C_PP_SET_PARAMS, &pp_param)来设置缩放前后的分辩率,bpp和格式.其结构定义在 s3c_pp_params_t 之中.

  3. 对pp设备使用ioctl命令ioctl(pp_dev->pp_fd, S3C_PP_ALLOC_KMEM, &alloc_info[0]),分配转换前的在内存.如果输出是LCD的,输出缓冲直接采用显存.

  4.将转换前数据拷贝到转换前内存之中

  5,对于PP调用 ioctl(pp_dev->pp_fd, S3C_PP_START); 进行转换. 

     如果是显存,则直接显示在LCD之上.

  6.退出时,调用ioctl(pp_dev->pp_fd, S3C_PP_FREE_KMEM, &alloc_info[0])  释放转换前的内存.

  7.关闭pp的设备设点

   

  1. #ifndef __S3C_PP_LIB_H__

  2. #define __S3C_PP_LIB_H__

  3. /*

  4.   Author: Andrew Huang 

  5.     descrition S3C6410 Post Process library

  6. */


  7. #ifdef __cplusplus

  8. extern 'C' {

  9. #endif


  10. typedef enum {

  11.     DMA_ONESHOT,

  12.     FIFO_FREERUN

  13. } s3c_pp_out_path_t;


  14. typedef enum {

  15.     PAL1, PAL2, PAL4, PAL8,

  16.     RGB8, ARGB8, RGB16, ARGB16, RGB18, RGB24, RGB30, ARGB24,

  17.     YC420, YC422, // Non-interleave

  18.     CRYCBY, CBYCRY, YCRYCB, YCBYCR, YUV444 // Interleave

  19. } s3c_color_space_t;


  20. typedef enum {

  21.     INTERLACE_MODE,

  22.     PROGRESSIVE_MODE

  23. } s3c_pp_scan_mode_t;



  24. // Structure type for IOCTL commands S3C_PP_SET_PARAMS, S3C_PP_SET_INPUT_BUF_START_ADDR_PHY,

  25. // S3C_PP_SET_INPUT_BUF_NEXT_START_ADDR_PHY, S3C_PP_SET_OUTPUT_BUF_START_ADDR_PHY.

  26. typedef struct {

  27.     unsigned int src_full_width;        // Source Image Full Width (Virtual screen size)

  28.     unsigned int src_full_height;        // Source Image Full Height (Virtual screen size)

  29.     unsigned int src_start_x;             // Source Image Start width offset

  30.     unsigned int src_start_y;             // Source Image Start height offset

  31.     unsigned int src_width;                // Source Image Width

  32.     unsigned int src_height;             // Source Image Height

  33.     unsigned int src_buf_addr_phy;         // Base Address of the Source Image : Physical Address

  34.     unsigned int src_next_buf_addr_phy; // Base Address of Source Image to be displayed next time in FIFO_FREERUN Mode

  35.     s3c_color_space_t src_color_space;     // Color Space of the Source Image


  36.     unsigned int dst_full_width;         // Destination Image Full Width (Virtual screen size)

  37.     unsigned int dst_full_height;         // Destination Image Full Height (Virtual screen size)

  38.     unsigned int dst_start_x;             // Destination Image Start width offset

  39.     unsigned int dst_start_y;             // Destination Image Start height offset

  40.     unsigned int dst_width;             // Destination Image Width

  41.     unsigned int dst_height;             // Destination Image Height

  42.     unsigned int dst_buf_addr_phy;        // Base Address of the Destination Image : Physical Address

  43.     s3c_color_space_t dst_color_space;     // Color Space of the Destination Image


  44.     s3c_pp_out_path_t out_path;      // output and run mode (DMA_ONESHOT or FIFO_FREERUN)

  45.     s3c_pp_scan_mode_t scan_mode; // INTERLACE_MODE, PROGRESSIVE_MODE

  46. } s3c_pp_params_t;


  47. // Structure type for IOCTL commands S3C_PP_ALLOC_KMEM, S3C_PP_FREE_KMEM.

  48. typedef struct {

  49.     int         size;

  50.     unsigned int     vir_addr;

  51.     unsigned int     phy_addr;

  52. } s3c_pp_mem_alloc_t;


  53. #define PP_IOCTL_MAGIC 'P'


  54. #define S3C_PP_SET_PARAMS             _IO(PP_IOCTL_MAGIC, 0)

  55. #define S3C_PP_START                     _IO(PP_IOCTL_MAGIC, 1)

  56. #define S3C_PP_GET_SRC_BUF_SIZE          _IO(PP_IOCTL_MAGIC, 2)

  57. #define S3C_PP_SET_SRC_BUF_ADDR_PHY _IO(PP_IOCTL_MAGIC, 3)

  58. #define S3C_PP_SET_SRC_BUF_NEXT_ADDR_PHY _IO(PP_IOCTL_MAGIC, 4)

  59. #define S3C_PP_GET_DST_BUF_SIZE          _IO(PP_IOCTL_MAGIC, 5)

  60. #define S3C_PP_SET_DST_BUF_ADDR_PHY     _IO(PP_IOCTL_MAGIC, 6)

  61. #define S3C_PP_ALLOC_KMEM _IO(PP_IOCTL_MAGIC, 7)

  62. #define S3C_PP_FREE_KMEM _IO(PP_IOCTL_MAGIC, 8)

  63. #define S3C_PP_GET_RESERVED_MEM_SIZE _IO(PP_IOCTL_MAGIC, 9)

  64. #define S3C_PP_GET_RESERVED_MEM_ADDR_PHY _IO(PP_IOCTL_MAGIC, 10)


  65. struct video_view {

  66.   int x;

  67.   int y;

  68.   int w;

  69.   int h;

  70.   int bpp;

  71.   int format;

  72.   char * buf;

  73.   int size;

  74.   char * phy_addr;

  75. };


  76.  struct fb_pp {

  77.       struct video_view fb_view;

  78.      struct video_view src_view;

  79.      int fb_fd;

  80.      int pp_fd;

  81.      int out_path;

  82.      int scan_mode;

  83.      s3c_pp_params_t    pp_param;

  84.      };


  85.  typedef struct

  86. {

  87.     unsigned int map_dma_f1;

  88.     unsigned int map_dma_f2;

  89. } s3c_fb_dma_info_t;


  90. extern int s3c_pp_setup(struct fb_pp * pp_dev,struct video_view * src,int out_path);

  91. extern int s3c_pp_open(struct fb_pp * pp_dev,int bpp);

  92. extern int s3c_pp_write(struct fb_pp * pp_dev,char * buf,int buf_len);


  93. extern int s3c_pp_write_file(struct fb_pp * pp_dev,char * filename);


  94. extern int s3c_pp_apply(struct fb_pp * pp_dev);


  95. #ifdef __cplusplus

  96. }

  97. #endif


  98. #endif /* __S3C_PP_LIB_H__ */

[1] [2]
关键字:Linux  s3c6410 引用地址:Linux 下使用s3c6410的post处理器的进行硬件缩放

上一篇:s3c6410 完全由SD卡启动Linux流程
下一篇:s3c6410 TVout 测试

推荐阅读最新更新时间:2024-11-12 18:14

S3C2440的Linux启动过程分析(一)——SC2440处理器结构
1.1.S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MMU单元等。CP15为一个协处理器(Co-Processor)。通过AMBA2.0(Advanced Microcontroller Bus Architecture)总线接口与外部设备相连。 图 1 S3C2440处理器框图 IVA指Instruction Virtual Address,指令虚拟地址;DVA指Data Virtual Address,数据虚拟地址。IPA指Instruction Physical Address,指令物
[单片机]
S3C2440的<font color='red'>Linux</font>启动过程分析(一)——SC2440<font color='red'>处理器</font>结构
基于ARM的嵌入式操作系统该如何设计
嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。 Linux做嵌入式的优势,首先,Linux是开放源代码;其次,Linux的内核小、效率高,可以定制,其系统内核最小只有约134KB;第三,Linux是免费的OS,Linux还有着嵌入式操作系统所需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台而且性能稳定,裁剪性很好,开发和使用都很容易。同时,Linux内核的结构在网络方面是非常完整的,Linux对网络中最常用的TCP/IP协议有最完备的支持。提供了包括十兆、百兆、千兆的以太网络,以及无线网络,Token Ring(令牌环网)、光纤甚至卫星的支持。
[单片机]
基于ARM的嵌入式操作系统该如何设计
ARM1176JZF-S/S3C6410处理器的异常处理过程
本来准备总结一下ARM1176JZF-S/S3C6410处理器的异常处理过程,但是发现《嵌入式系统Linux内核开发实战指南》一书中的这一部分讲解得非常简明和清楚。所以就不再重复发明轮子,不过我会在以下的引用中做一些补充。 进入异常中断处理 ARM处理器发生异常中断,则ARM处理器进入如下异常中断自动处理过程(假设发生的异常中断对应的模式为mode): 将当前程序状态寄存器CPSR的值保存到SPSR_mode中; 将CPSR中的模式位设置成mode模式,将CPSR中的bit7(I)设置为1,禁止IRQ中断,如果是FIQ中断,则再将CPSR中的bit6(F)设置为1,禁止FIQ中断; 将返回地址传给lr_mode; 将该异
[单片机]
ARM1176JZF-S/<font color='red'>S3C6410</font><font color='red'>处理器</font>的异常处理过程
Linux 补丁显示龙芯 3A6000 系列处理器将支持同步多线程 SMT 技术
龙芯中科此前透露,龙芯 3A6000 已流片回来,但仅经过初步测试,后续还有性能摸底、优化与产品化的过程,而且完成产品化计划需要半年到一年的时间。 自上月开始,龙芯工程师已经为 Linux 进行适配,以便在其即将推出的 3A6000 系列处理器上稳定运行 Linux。 龙芯近日发布了新的 Linux 补丁,表明龙芯 3A6000 处理器将支持同时多线程(SMT) 技术。类似于常见的英特尔、AMD 和 POWER 处理器,SMT 可使逻辑核心数量翻倍,即 4 核 8 线程这类形式。 同时多线程(Simultaneous multithreading,SMT)也称同步多线程,英特尔营销术语即“超线程”,是一种提高具有硬件多
[嵌入式]
基于S3C2440的Linux内核移植和yaffs2文件系统制作-- 配置Linux内核
1.3.3 配置Linux内核 1、 进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。 make s3c2410_defconfig 2、 配置内核模块的功能,有几种方式可以进行界面选择: make menuconfig(文本选单的配置方式,在有字符终端下才能使用) make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用) make oldconfig(文本配置方式,在原内核配置的基础修改时使用) 这里使用make menuconfi
[单片机]
[零碎知识]arm-linux程序反编译bin文件成汇编的指令
命令格式: arm-linux-objdump -D -b binary -m arm file.bin file.asm 描述: -D 指反编译文件所有内容 -b binary 源文件格式 是二进制的bin文件 -m 指machine的类型 表示生成的文件重定向到哪里去,注意与 区分, 代表的是在文件后附加 file.bin 是你要反汇编的源bin文件 file.asm 是存放生成的汇编源文件
[单片机]
linux-2.6.35.3内核移植(s3c2440)
宿 主机:Fedora13 目标 机:s3c2440 交叉 编译 器:arm-linux-gcc-3.4.1 交叉编译器路径:/usr/local/arm/3.4.1 要移植 的内核 版本:linux-2.6.35.3 文件 系统 类型: yaffs2 一、准备工作 1、下载 解压内核 从官网上下载linux-2.6.35的内核, ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ ,文件不大,约85M。 新建一个工作目录s3c2440,将内核源码包拷贝至工作目录下,再解压。 2、移植yaffs2驱动 下载最新的驱动http://www.aleph1.co.uk/cgi
[单片机]
Linux2.6.32驱动笔记(4)ioctl方法解析及mini2440-led驱动实现
摘要: 介绍了字符设备驱动的控制方式——ioctl,同时利用该方式在mini2440上实现led驱动。 驱动中,除了read,write,open,close之外,还有很多的访问方式,其中对于设备的控制,ioctl是一种重要的方式。 一、ioctl函数 int ioctl(int fd,unsigned long cmd,…) fd:要控制的设备文件描述符 cmd:发送给设备的控制命令 …:可选参数,依赖于第二个cmd参数 当应用程序使用ioctl的时候,驱动程序将由如下驱动函数来响应: 2.6.36内核以前: long(*ioctl)(struct inode
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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