Hi,

I am writing a gfxdriver for Fujitsu mb86296 video card under DirectFB. When
I register layer in my driver, the example df_fire (
DirectFB-examples-1.0.0.tar.gz), there is no output in computer screen. the
error result looks like this:

sh-3.00# ./df_fire

     =======================|  DirectFB 1.0.0  |=======================
          (c) 2001-2007  The DirectFB Organization (directfb.org)
          (c) 2000-2004  Convergence (integrated media) GmbH
        ------------------------------------------------------------

(*) DirectFB/Core: Single Application Core. (2008-08-07 20:19) [ DEBUG ][
TRACE ]
(*) Direct/Memcpy: Using ppcasm_memcpy()
(*) Direct/Thread: Running 'VT Switcher' (CRITICAL, 527)...
(*) Direct/Thread: Running 'PS/2 Input' (INPUT, 529)...
(*) DirectFB/Input: IMPS/2 Mouse 1.0 (directfb.org)
(*) Direct/Thread: Running 'Keyboard Input' (INPUT, 530)...
(*) DirectFB/Input: Keyboard 0.9 (directfb.org)
(*) DirectFB/Graphics: Fujitsu Fujitsu MB86296 0.5 (Atom Create)
(!) [  519:    0.000] --> Caught signal 11 (at (nil), invalid address) <--
(-) [  519: -STACK- ]
  #0  0x0fe9db44 in signal_handler () from
/mnt/gtkdfb/lib/libdirect-1.0.so.0
[0xfe90000]
  #1  0x0ffaece8 in dfb_layers_initialize () from
/mnt/gtkdfb/lib/libdirectfb-1.0.so.0 [0xff35000]
  #2  0x0ff980c8 in dfb_core_part_initialize () from
/mnt/gtkdfb/lib/libdirectfb-1.0.so.0 [0xff35000]
  #3  0x0ff97620 in dfb_core_initialize () from
/mnt/gtkdfb/lib/libdirectfb-1.0.so.0 [0xff35000]
  #4  0x0ff97a70 in dfb_core_arena_initialize () from
/mnt/gtkdfb/lib/libdirectfb-1.0.so.0 [0xff35000]
  #5  0x0fed45b0 in fusion_arena_enter () from
/mnt/gtkdfb/lib/libfusion-1.0.so.0 [0xfed0000]
  #6  0x0ff953e0 in dfb_core_create () from
/mnt/gtkdfb/lib/libdirectfb-1.0.so.0 [0xff35000]
  #7  0x100127b4 in DirectFBCreate () from ./df_fire [0x10000000]

(-) [  527: -STACK- 'VT Switcher']
  #0  0x0fcbf150 in vt_thread () from
/mnt/gtkdfb/lib/directfb-1.0-0/systems/libdirectfb_fbdev.so [0xfcb5000]

(-) [  529: -STACK- 'PS/2 Input']
  #0  0x0fb730d4 in ps2mouseEventThread () from
/mnt/gtkdfb/lib/directfb-1.0-0/inputdrivers/libdirectfb_ps2mouse.so
[0xfb71000]

(-) [  530: -STACK- 'Keyboard Input']
  #0  0x0fc247b8 in keyboardEventThread () from
/mnt/gtkdfb/lib/directfb-1.0-0/inputdrivers/libdirectfb_keyboard.so
[0xfc22000]

Aborted

my mb86296_layer.c refers to sh7722 gfxdriver and I don't understand some of
it since I don't have its munual. my mb86296_layer.c is as follows:

/*
   mb86296_layer.c

   (c) Copyright 2001-2007  The DirectFB Organization (directfb.org)
   (c) Copyright 2000-2004  Convergence (integrated media) GmbH

   All rights reserved.

   Written by Antonino Daplas <[EMAIL PROTECTED]>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the
   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.
*/

#include <config.h>

#include <sys/ioctl.h>

#include <string.h>

#include <fbdev/fbdev.h>  /* FIXME: Needs to be included before dfb_types.h
to work around a type clash with asm/types.h */

#include <core/coredefs.h>
#include <core/layers.h>
#include <core/surfaces.h>
#include <core/screens.h>
#include <core/screen.h>

#include <fbdev/fbdev.h>

#include <direct/mem.h>

#include <gfx/convert.h>

#include "mb86296.h"
#include "mb86290fbsys.h"



extern unsigned long drawRegRead32(unsigned long nOffset);
extern unsigned long geoRegRead32(unsigned long nOffset);
extern unsigned long dispRegRead32(unsigned long nOffset);
extern void drawRegWrite32(unsigned long nOffset, unsigned long nVal);
extern void geoRegWrite32(unsigned long nOffset, unsigned long nVal);
extern void dispRegWrite32(unsigned long nOffset, unsigned long nVal);


#define MB86296_OVERLAY_SUPPORTED_OPTIONS (DLOP_DST_COLORKEY |
DLOP_DEINTERLACING)

void
mb86296ovlOnOff( mb86296DriverData *idrv,
              mb86296DeviceData *idev,
              bool            on,
     int n)
{
 unsigned long reg;
     if (!on)
   if (n = 0)
   {
    reg = dispReadReg(GDC_DISP_REG_EXT_MODE);
    dispRegWrite32(GDC_DISP_REG_EXT_MODE, reg & 0xfffeffff);
   }
   else if (n = 1)
   {
    reg = dispReadReg(GDC_DISP_REG_EXT_MODE);
    dispRegWrite32(GDC_DISP_REG_EXT_MODE, reg | 0xfffbffff);
   }
   else if (n = 2)
   {
    reg = dispReadReg(GDC_DISP_REG_EXT_MODE);
    dispRegWrite32(GDC_DISP_REG_EXT_MODE, reg | 0xffff7ffff);
   }

}

static int
mb86296LayerDataSize()
{
 return sizeof(MB86296LayerData);
}

static DFBResult
mb86296InitLayer(
              CoreLayer                  *layer,
       void                       *driver_data,
       void                       *layer_data,
              DFBDisplayLayerDescription *description,
              DFBDisplayLayerConfig      *config,
              DFBColorAdjustment         *adjustment )
{

 mb86296DriverData *sdrv = driver_data;
    mb86296LayerData  *data = layer_data;

 /* initialize layer data */
     data->layer = MB86296_LAYER_INPUT1 + sdrv->num_inputs++;
   /* set capabilities and type */
     description->caps = DLCAPS_SURFACE | DLCAPS_ALPHACHANNEL |
DLCAPS_OPACITY |
                         DLCAPS_SCREEN_POSITION | DLCAPS_SRC_COLORKEY |
DLCAPS_LEVELS;

     description->type = DLTF_STILL_PICTURE | DLTF_GRAPHICS | DLTF_VIDEO |
DLTF_BACKGROUND;

     /* set name */
     snprintf( description->name, DFB_DISPLAY_LAYER_DESC_NAME_LENGTH, "Input
%d", sdrv->num_inputs );

     /* fill out the default configuration */
     config->flags       = DLCONF_WIDTH       | DLCONF_HEIGHT |
                           DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE |
DLCONF_OPTIONS;
     config->width       = MB86290FB_DFLT_IP_HDP;
     config->height      = MB86290FB_DFLT_IP_VDP;
     config->pixelformat = DSPF_RGB16;
     config->buffermode  = DLBM_FRONTONLY;
     config->options     = DLOP_NONE;

     return DFB_OK;
}

static DFBResult
mb86296TestRegion( CoreLayer              *layer,
               void                       *driver_data,
               void                       *layer_data,
               CoreLayerRegionConfig      *config,
               CoreLayerRegionConfigFlags *failed )
{
 mb86296LayerData *slay = layer_data;
     CoreLayerRegionConfigFlags  fail = 0;

     if (config->options & ~MB86296_LAYER_SUPPORTED_OPTIONS)
          fail |= CLRCF_OPTIONS;

     switch (config->format) {
          /* TODO: LUT8 on OSD  (Input 3) */
          case DSPF_NV12:
          case DSPF_NV16:
               /* YUV only for first input */
               if (slay->layer != MB86296_LAYER_INPUT1)
                    fail |= CLRCF_FORMAT;
               break;

          case DSPF_ARGB:
          case DSPF_RGB32:
          case DSPF_RGB24:
          case DSPF_RGB16:
               break;

          default:
               fail |= CLRCF_FORMAT;
     }

     if (config->width  < 32 || config->width  > 1280)
          fail |= CLRCF_WIDTH;

     if (config->height < 32 || config->height > 1024)
          fail |= CLRCF_HEIGHT;

     if (config->dest.x >= MB86290FB_DFLT_IP_HDP || config->dest.y >=
MB86290FB_DFLT_IP_VDP)
          fail |= CLRCF_DEST;

     if (config->dest.x < 0) {
          config->dest.x = 0;
//          fail |= CLRCF_DEST;
     }

     if (config->dest.y < 0) {
          config->dest.y = 0;
//          fail |= CLRCF_DEST;
     }

     if (failed)
          *failed = fail;

     if (fail)
          return DFB_UNSUPPORTED;

     return DFB_OK;
}

static DFBResult
mb86296SetRegion( CoreLayer                  *layer,
              void                       *driver_data,
              void                       *layer_data,
              void                       *region_data,
              CoreLayerRegionConfig      *config,
              CoreLayerRegionConfigFlags  updated,
              CoreSurface                *surface,
              CorePalette                *palette)
{

  int               n;
     mb86296DriverData *sdrv = driver_data;
     mb86296DeviceData *sdev = sdrv->dev;
     MB86296RegionData *sreg = region_data;
     MB86296LayerData  *slay = layer_data;

     n = slay->layer - MB86296_LAYER_INPUT1;

     D_ASSERT( n >= 0 );
     D_ASSERT( n <= 2 );

     /* Update position? */
     if (updated & CLRCF_DEST) {
          /* Set horizontal and vertical offset. */

  if(n = 0)
   dispRegWrite32(GDC_DISP_REG_L0_WIN_POS, config->dest.y << 16) |
config->dest.x);
  else if(n = 1)
   dispRegWrite32(GDC_DISP_REG_L2_WIN_POS, config->dest.y << 16) |
config->dest.x);
  else if (n = 2)
   dispRegWrite32(GDC_DISP_REG_L4_WIN_POS, config->dest.y << 16) |
config->dest.x);

     }

     /* Update size? */
     if (updated & (CLRCF_WIDTH | CLRCF_HEIGHT)) {
          int cw = config->width;
          int ch = config->height;

          if (config->dest.x + cw > MB86296_LCD_WIDTH)
               cw = SH7722_LCD_WIDTH - config->dest.x;

          if (config->dest.y + ch > MB86296_LCD_HEIGHT)
               ch = SH7722_LCD_HEIGHT - config->dest.y;


  if (n = 0)
   dispRegWrite32(GDC_DISP_REG_L0_WIN_SIZE, (ch << 16) | cw);
  else if (n = 1)
   dispRegWrite32(GDC_DISP_REG_L2_WIN_SIZE, (ch << 16) | cw);
  else if (n = 2)
   dispRegWrite32(GDC_DISP_REG_L4_WIN_SIZE, (ch << 16) | cw);
     }


     /* Update format? */
     if (updated & CLRCF_FORMAT) {
          unsigned long tBSIFR = 0;

          /* Set pixel format. */
          switch (config->format) {
               case DSPF_NV12:
                    tBSIFR |= CHRR_YCBCR_420 | 0x1000;
                    break;

               case DSPF_NV16:
                    tBSIFR |= CHRR_YCBCR_422 | 0x1000;
                    break;

               case DSPF_ARGB:
                    tBSIFR |= RPKF_ARGB;
   if (n = 0)
   dispRegWrite32(GDC_DISP_REG_C_MODE_W_H,
dispRegRead32(GDC_DISP_REG_C_MODE_W_H) | 0); //8bits/pixel
   else if (n = 1)
   dispRegWrite32(GDC_DISP_REG_ML_MODE_W_H,
dispRegRead32(GDC_DISP_REG_ML_MODE_W_H) | 0);
   else if (n = 2)
   dispRegWrite32(GDC_DISP_REG_BL_MODE_W_H,
dispRegRead32(GDC_DISP_REG_BL_MODE_W_H) | 0);
                    break;

               case DSPF_RGB32:
                    tBSIFR |= RPKF_RGB32;
                    break;

               case DSPF_RGB24:
                    tBSIFR |= RPKF_RGB24;
                    break;

               case DSPF_RGB16:
                    tBSIFR |= RPKF_RGB16;
      if (n = 0)
      dispRegWrite32(GDC_DISP_REG_C_MODE_W_H,
dispRegRead32(GDC_DISP_REG_C_MODE_W_H) | 1); //16bits/pixel
      else if (n = 1)
      dispRegWrite32(GDC_DISP_REG_ML_MODE_W_H,
dispRegRead32(GDC_DISP_REG_ML_MODE_W_H) | 1);
         else if (n = 2)
      dispRegWrite32(GDC_DISP_REG_BL_MODE_W_H,
dispRegRead32(GDC_DISP_REG_BL_MODE_W_H) | 1);
                    break;

               default:
                    break;
          }

 }

     /* Update options or opacity? */
     if (updated & (CLRCF_OPTIONS | CLRCF_OPACITY)) {
          unsigned long tBBLCR0 = LAY_123;

          /* Set opacity value. */
          tBBLCR0 &= ~(0xff << (n*8));
          tBBLCR0 |= ((config->options & CLRCF_OPACITY) ? config->opacity :
0xff) << (n*8);

          /* Enable/disable alpha channel. */
         if (config->options & DLOP_ALPHACHANNEL)
               tBBLCR0 |= (0x10000000 << n);
          else
               tBBLCR0 &= ~(0x10000000 << n);

     }

     /* Enable or disable input. */
     if ((config->options & DLOP_OPACITY) && !config->opacity)
          sdev->input_mask &= ~(1 << n);
     else
          sdev->input_mask |= (1 << n);

     sreg->config = *config;


     return DFB_OK;

}


DisplayLayerFuncs mb86296LayerFuncs = {
     LayerDataSize:      mb86296LayerDataSize,
     InitLayer:          mb86296InitLayer,
     TestRegion:         mb86296TestRegion,
     SetRegion:          mb86296SetRegion,

};

in driver_init_driver() , I called  dfb_layers_register() to register three
layers since my video card support six layers.

/* Register three input system layers. */
     sdrv->input1 = dfb_layers_register( sdrv->screen, driver_data,
&mb86296LayerFuncs );
     sdrv->input2 = dfb_layers_register( sdrv->screen, driver_data,
&mb86296LayerFuncs );
     sdrv->input3 = dfb_layers_register( sdrv->screen, driver_data,
&mb86296LayerFuncs );

I don't get what is wrong in my code. has anybody who has wriiten the
gfxdriver for the same video card help me out. Thanks in advance.

Sincerely yours,
liuxs
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to