xenocara/driver/xf86-video-sis/src/initextx.h
oga 73d1e76463 Update SiS driver to 0.10
Tested by todd.
ok Matthieu.
2008-04-19 14:03:12 +00:00

499 lines
17 KiB
C

/*
* X.org/XFree86 specific supplements to init.c/init301.c
*
* Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1) Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2) Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3) The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
*/
#ifndef _INITEXTX_H_
#define _INITEXTX_H_
#include "osdef.h"
#include "initdef.h"
#include "sis.h"
#include "sis_regs.h"
#ifdef SIS315H
static const struct {
unsigned char Ext_ModeID; /* ModeID in new ROM */
unsigned char Ext_MyModeID; /* corresponding ModeID in my tables (0 = identical) */
unsigned short Ext_VESAID; /* corresponding VESA ID in new ROM */
} SiS_EModeIDTable661[] = {
{ 0x6a, 0x00, 0x0102 },
{ 0x1d, 0x20, 0x0000 },
{ 0x1e, 0x21, 0x0000 },
{ 0x1f, 0x22, 0x0000 },
{ 0x20, 0x29, 0x0000 },
{ 0x21, 0x2a, 0x0000 },
{ 0x22, 0x2b, 0x0000 },
{ 0x23, 0x00, 0x011c },
{ 0x24, 0x00, 0x011d },
{ 0x25, 0x00, 0x011e },
{ 0x26, 0x00, 0x011f },
{ 0x27, 0x00, 0x0120 },
{ 0x28, 0x00, 0x0121 },
{ 0x2a, 0x14, 0x013d },
{ 0x2b, 0x15, 0x013e },
{ 0x2c, 0x16, 0x013f },
{ 0x2e, 0x00, 0x0101 },
{ 0x2f, 0x00, 0x0100 },
{ 0x30, 0x00, 0x0103 },
{ 0x37, 0x00, 0x0104 },
{ 0x38, 0x00, 0x0105 },
{ 0x3a, 0x00, 0x0107 },
{ 0x3c, 0x00, 0x0125 },
{ 0x3d, 0x00, 0x0126 },
{ 0x40, 0x00, 0x010d },
{ 0x41, 0x00, 0x010e },
{ 0x43, 0x00, 0x0110 },
{ 0x44, 0x00, 0x0111 },
{ 0x46, 0x00, 0x0113 },
{ 0x47, 0x00, 0x0114 },
{ 0x49, 0x00, 0x0116 },
{ 0x4a, 0x00, 0x0117 },
{ 0x4c, 0x00, 0x0119 },
{ 0x4d, 0x00, 0x011a },
{ 0x50, 0x00, 0x0127 },
{ 0x51, 0x00, 0x0128 },
{ 0x52, 0x00, 0x0129 },
{ 0x53, 0x1a, 0x0141 },
{ 0x54, 0x1b, 0x0142 },
{ 0x55, 0x1c, 0x0143 },
{ 0x56, 0x00, 0x012a },
{ 0x57, 0x00, 0x012b },
{ 0x58, 0x00, 0x012c },
{ 0x59, 0x00, 0x012d },
{ 0x5a, 0x17, 0x012e },
{ 0x5b, 0x18, 0x012f },
{ 0x5c, 0x19, 0x0130 },
{ 0x5d, 0x00, 0x0131 },
{ 0x62, 0x00, 0x0112 },
{ 0x63, 0x00, 0x0115 },
{ 0x64, 0x00, 0x0118 },
{ 0x65, 0x00, 0x011b },
{ 0x66, 0x00, 0x0132 },
{ 0x75, 0x00, 0x013a },
{ 0x78, 0x00, 0x013b },
{ 0x79, 0x00, 0x013c },
{ 0x7b, 0x7c, 0x0136 },
{ 0x7c, 0x7d, 0x0137 },
{ 0x7d, 0x7e, 0x0138 },
{ 0xff, 0xff, 0xffff }
};
#endif
#define SIS_PL_HSYNCP 0x01
#define SIS_PL_HSYNCN 0x02
#define SIS_PL_VSYNCP 0x04
#define SIS_PL_VSYNCN 0x08
#define SIS_PL_DVI 0x80
struct SiS_PlasmaModes
{
const char *name;
unsigned int clock;
unsigned short HDisplay, HTotal, HFrontPorch, HSyncWidth;
unsigned short VDisplay, VTotal, VFrontPorch, VSyncWidth;
unsigned char SyncFlags;
};
struct SiS_PlasmaTables
{
unsigned short vendor;
unsigned char productnum;
unsigned short product[5];
const char *DDCnames[5];
const char *plasmaname;
unsigned short maxx,maxy;
unsigned short prefx, prefy;
unsigned char modenum;
unsigned char plasmamodes[20]; /* | 0x80 = DVI-capable, | 0x40 = analog */
};
static const struct SiS_PlasmaModes SiS_PlasmaMode[] = {
{ "640x400", /* 00: IBM 400@70 */
25175,
640, 800, 17, 64,
400, 449, 13, 2,
SIS_PL_HSYNCN | SIS_PL_VSYNCN },
{ "640x480", /* 01: VESA 480@72 */
31500,
640, 832, 24, 40,
480, 520, 9, 3,
SIS_PL_HSYNCN | SIS_PL_VSYNCN },
{ "800x600", /* 02: VESA 600@72 */
50000,
800, 1040, 56, 120,
600, 666, 37, 6,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "864x480", /* 03: Cereb wide 1 */
42526,
864, 1134, 22, 86,
480, 500, 1, 3,
SIS_PL_HSYNCP | SIS_PL_VSYNCN },
{ "848x480", /* 04: VESA wide (NEC1) */
33750,
848, 1088, 16, 112,
480, 517, 6, 8,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1024x576", /* 05: VESA wide (NEC2) */
47250,
1024, 1320, 16, 144,
576, 596, 2, 4,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1280x720", /* 06: VESA wide (NEC3) */
76500,
1280, 1696, 48, 176,
720, 750, 4, 8,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1360x765", /* 07: VESA wide (NEC4) */
85500,
1360, 1792, 64, 176,
765, 795, 4, 8,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1024x600", /* 08: CEREB wide 2 */
51200,
1024, 1352, 51, 164,
600, 628, 1, 4,
SIS_PL_HSYNCN | SIS_PL_VSYNCP },
{ "1024x768", /* 09: VESA 768@75 */
78750,
1024, 1312, 16, 96,
768, 800, 1, 3,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1152x864", /* 10: VESA 1152x864@75 */
108000,
1152, 1600, 64, 128,
864, 900, 1, 3,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1280x1024", /* 11: VESA 1024@60 */
108000,
1280, 1688, 48, 112,
1024, 1066, 1, 3,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1280x768", /* 12: W_XGA */
81000,
1280, 1688, 48, 112,
768, 802, 3, 6,
SIS_PL_HSYNCP | SIS_PL_VSYNCN },
{ "1280x768", /* 13: I/O Data W_XGA@56Hz */
76064,
1280, 1688, 48, 112,
768, 802, 2, 3,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1376x768", /* 14: I/O Wide XGA */
87340,
1376, 1808, 32, 128,
768, 806, 3, 6,
SIS_PL_HSYNCN | SIS_PL_VSYNCP },
{ "1280x960", /* 15: VESA 960@60 */
108000,
1280, 1800, 96, 112,
960, 1000, 1, 3,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1400x1050", /* 16: VESA 1050@60Hz */
108000,
1400, 1688, 48, 112,
1050, 1066, 1, 3,
SIS_PL_HSYNCN | SIS_PL_VSYNCN },
{ "1360x768", /* 17: VESA wide (NEC4/2) */
85500,
1360, 1792, 64, 112,
765, 795, 3, 6,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "800x600", /* 18: VESA 600@56 */
36000,
800, 1024, 24, 2,
600, 625, 1, 2,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1072x600", /* 19: Panasonic 1072x600 (sync?) */
54100,
1072, 1424, 48, 176,
600, 628, 16, 1,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "848x480", /* 20: Panasonic 848x480 (sync?) */
33070, /* is 852x480, but we can't use 852 */
848, 1068, 20, 40, /* differs from DDC data, better centered */
480, 516, 3, 5, /* won't work assumingly, because data is % 8 */
SIS_PL_HSYNCN | SIS_PL_VSYNCN },
{ "1280x720", /* 21: WIDE720(60) (aka "750p") (Panasonic) */
74300,
1280, 1650,110, 40,
720, 750, 5, 5,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1280x768", /* 22: 1280x768@56.5 (Panasonic) */
76200, /* (According to manual not supported for HDMI; but works) */
1280, 1680, 16, 24,
768, 802, 2, 5,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1280x720@50", /* 23: WIDE720(50) (aka "750p") (Panasonic) */
74300, /* Panasonic states 45.0kHz. Not possible. This one works (with some overscan) */
1280, 1980,400, 80,
720, 750, 1, 2,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "720x480", /* 24: 720x480 (aka "525p" and "480p") (Panasonic) */
27000,
720, 856, 40, 32,
480, 525, 1, 3,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "720x576", /* 25: 720x576 (aka "625p"and "576p") (Panasonic) */
27500,
720, 864, 16, 64,
576, 625, 5, 6,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
{ "1280x720@50", /* 26: WIDE720(50) (aka "750p") (Generic) */
74300,
1280, 1980,400, 80,
720, 750, 5, 5,
SIS_PL_HSYNCP | SIS_PL_VSYNCP },
};
/*
27.00 720 755 791 858 480 480 484 525
27.50 720 732 795 864 576 581 587 625
*/
static const struct SiS_PlasmaTables SiS_PlasmaTable[] = {
#if 0 /* Product IDs missing */
{ 0x38a3, 4,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 42VP4/42VP4D/42VP4G/42VP4DG",
0, 0,
0, 0,
11, /* All DVI, except 0, 7, 13 */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0,
17|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
#endif
#if 0 /* Product IDs missing */
{ 0x38a3, 3,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 42PD1/50PD1/50PD2",
0, 0,
0, 0,
5, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0, 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x38a3, 1,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 42PD3",
0, 0,
0, 0,
10, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 7|0x40, 8|0xc0, 9|0xc0,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x38a3, 2,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 42VM3/61XM1",
0, 0,
0, 0,
11, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 8|0xc0, 9|0xc0,11|0xc0,
17|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x38a3, 2,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 42MP1/42MP2",
0, 0,
0, 0,
6, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x38a3, 1,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 50MP1",
0, 0,
0, 0,
10, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
#endif
{ 0x38a3, 4,
{ 0xa482, 0xa483, 0x0000, 0x0000, 0x0000 },
{ "PX-42VM", "", "", "", "" },
"NEC PlasmaSync 42MP3/42MP4/50MP2/61MP1",
0, 0,
0, 0,
11, /* All DVI except 0, 7, 13, 17 */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0,
17|0x40, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
#if 0 /* Product IDs missing */
{ 0x38a3, 1,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 3300W",
0, 0,
0, 0,
3,
{ 0|0x40, 1|0xc0,18|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x38a3, 1,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 4200W",
4, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x38a3, 1,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 4210W",
0, 0,
0, 0,
6, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x38a3, 1,
{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"NEC PlasmaSync 5000W",
0, 0,
0, 0,
7, /* DVI entirely unknown */
{ 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,11|0xc0, 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
#endif
{ 0x412f, 2,
{ 0x000c, 0x000b, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"Pioneer 503CMX/PDA-5002",
0, 0,
0, 0,
6, /* DVI unknown */
{ 1|0xc0, 2|0xc0, 9|0xc0,11|0xc0,12|0xc0,15|0xc0, 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x34a9, 1,
{ 0xa00e, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "", "", "", "", "" },
"Panasonic TH-42",
0, 0,
0, 0,
5, /* No DVI output */
{ 1|0x40, 2|0x40, 4|0x40, 9|0x40,15|0x40, 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x34a9, 1,
{ 0xa005, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "TH-42PW*4", "", "", "", "" },
"Panasonic TH-42PW5",
0, 0,
0, 0,
1, /* No special modes otherwise; no DVI. */
{20|0x40,19|0x40, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x4c2e, 1,
{ 0x9b05, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "PLV-Z2", "", "", "", "" },
"Sanyo PLV-Z2 (non HDCP-mode)", /* HDCP mode would be id 9b06, but not needed */
1280, 768, /* as it then advertises correct size */
1280, 720,
1, /* 1280x720, no special modes otherwise */
{21|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x34a9, 1,
{ 0xd034, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "AE500U (DVI-D)", "", "", "", "" },
"Panasonic AE500U",
1280, 768,
1280, 720,
1, /* 1280x720, no special modes otherwise */
{21|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x34a9, 1,
{ 0xd043, 0x0000, 0x0000, 0x0000, 0x0000 },
{ "AE700U (HDMI)", "", "", "", "" },
"Panasonic AE700U",
1360, 768,
1280, 720,
6, /* 1280x720/60, 1280x720/50, 1280x768@56(digital/analog), 720x480, 720x576 */
{21|0xc0,23|0xc0,22|0x80,13|0x40,24|0x80,25|0x80, 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
{ 0x0000 }
};
unsigned short SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned int VBFlags);
DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN);
int SiSTranslateToVESA(ScrnInfoPtr pScrn, int modenumber);
int SiSTranslateToOldMode(int modenumber);
BOOLEAN SiS_GetPanelID(struct SiS_Private *SiS_Pr);
unsigned short SiS_SenseLCDDDC(struct SiS_Private *SiS_Pr, SISPtr pSiS);
unsigned short SiS_SenseVGA2DDC(struct SiS_Private *SiS_Pr, SISPtr pSiS);
void SiS_CalcXTapScaler(struct SiS_Private *SiS_Pr, int srcsize, int destsize, int taps, Bool ishoriz);
void SiS_SetGroup2_C_ELV(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex);
extern unsigned char SiS_GetReg(SISIOADDRESS port, unsigned short index);
extern void SiS_SetReg(SISIOADDRESS port, unsigned short index, unsigned short data);
extern void SiS_SetRegOR(SISIOADDRESS, unsigned short, unsigned short);
extern void SiS_SetRegAND(SISIOADDRESS, unsigned short, unsigned short);
extern void SiS_SetRegANDOR(SISIOADDRESS Port, unsigned short Index, unsigned short DataAND,
unsigned short DataOR);
extern int SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div,
int *out_sbit, int *out_scale);
extern void SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk);
extern void SiS_CalcCRRegisters(struct SiS_Private *SiS_Pr, int depth);
extern BOOLEAN SiSInitPtr(struct SiS_Private *SiS_Pr);
extern unsigned short SiS_GetRefCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide);
extern unsigned short SiS_GetRefCRTVCLK(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide);
extern void SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata,
int xres, int yres, DisplayModePtr current);
extern unsigned short SiS_InitDDCRegs(struct SiS_Private *SiS_Pr, unsigned int VBFlags, int VGAEngine,
unsigned short adaptnum, unsigned short DDCdatatype, BOOLEAN checkcr32,
unsigned int VBFlags2);
extern unsigned short SiS_ProbeDDC(struct SiS_Private *SiS_Pr);
extern unsigned short SiS_ReadDDC(struct SiS_Private *SiS_Pr, unsigned short DDCdatatype,
unsigned char *buffer);
#endif