I had achieve some more progress in graphics acceleration with TC6393.
Here is code snippets for:
1 Draw solid rectangular area with top left corner in point (x,y) and dimensions (width,height) and color(color).
static uint32_t cmd [11];
int len = 0;
int ret;
cmd[++len] = PXAIO_COMDI_DSADR | PXAIO_COMDD_DSADR ((x*2+((long)960L*y)));
cmd[++len] = PXAIO_COMDI_DHPIX | PXAIO_COMDD_DHPIX (width);
cmd[++len] = PXAIO_COMDI_DVPIX | PXAIO_COMDD_DVPIX (height);
cmd[++len] = PXAIO_COMDI_FILL | PXAIO_COMDD_FILL (color);
cmd[++len] = PXAIO_COMDI_FLGO;
cmd[0] = len;
if ((ret = ioctl (fd, TC6393FB_ACC_CMD_WRITE, cmd)) < 0)
perror ("ioctl");
printf ("TC6393FB_ACC_CMD_WRITE returned %d\n", ret);
if ((ret = ioctl (fd, TC6393FB_ACC_SYNC, 0)) < 0)
perror("ioctl");
printf ("TC6393FB_ACC_SYNC returned %d\n", ret);
2 Setup pattern for ROP3 filling and copying. Pattern is at patAddr in TC6393 video memory, and pattern dimension is patWidth,patHeight
static uint32_t cmd [11];
int len = 0;
int ret;
/* Pattern setup */
cmd[++len] = PXAIO_COMDI_PSADR | PXAIO_COMDD_PSADR (patAddr);
cmd[++len] = PXAIO_COMDI_POADR | PXAIO_COMDD_POADR (patAddr);
cmd[++len] = PXAIO_COMDI_PHPIX | PXAIO_COMDD_PHPIX (patWidth);
cmd[++len] = PXAIO_COMDI_PVPIX | PXAIO_COMDD_PVPIX (patHeight);
cmd[++len] = PXAIO_COMDI_PHOFS | PXAIO_COMDD_PHOFS (0);
cmd[++len] = PXAIO_COMDI_PVOFS | PXAIO_COMDD_PVOFS (0);
cmd[0] = len;
if ((ret = ioctl (fd, TC6393FB_ACC_CMD_WRITE, cmd)) < 0)
perror ("ioctl");
3 Filling area with pattern- area is (x,y,width,height), code of ROP3 operation is ropCode
(area copying with rop3 is similar)
len=0;
/* Destination setup and run command*/
cmd[++len] = PXAIO_COMDI_DSADR | PXAIO_COMDD_DSADR ((2*x+960*(y)));
cmd[++len] = PXAIO_COMDI_DHPIX | PXAIO_COMDD_DHPIX (width);
cmd[++len] = PXAIO_COMDI_DVPIX | PXAIO_COMDD_DVPIX (height);
cmd[++len] = PXAIO_COMDI_RSTR | PXAIO_COMDD_RSTR (ropCode);
cmd[++len] = PXAIO_COMDI_FLGO | PXAIO_COMDD_FLGO_ROP3;
cmd[0] = len;
if ((ret = ioctl (fd, TC6393FB_ACC_CMD_WRITE, cmd)) < 0)
perror ("ioctl");
if ((ret = ioctl (fd, TC6393FB_ACC_SYNC, 0)) < 0)
perror("ioctl");
4 Draw line from point (x1,y1) to point (x2,y2) with color (color)
int dx = 0;
int dy = 0;
int flag = 0;
int bk2 = 0;
int ini = 0;
if ( x1 < x2 )
{
dx = x2-x1;
}
else
{
dx = x1-x2;
flag = flag | PXAIO_COMDD_LDGO_LHRV;
}
if ( y1 < y2 )
{
dy = y2-y1;
}
else
{
dy = y1-y2;
flag = flag | PXAIO_COMDD_LDGO_LVRV;
}
if ( dy == 0 ) //special case for horizontal line
{
ini = 0x8000;
}
else if ( dy <= dx )
{
bk2 = (dy-dx)<<1;
}
else if ( dx == 0 ) //special case for vertical line
{
ini = 0x8000;
flag = flag | PXAIO_COMDD_LDGO_LDMOD;
}
else
{
bk2 = (dx-dy)<<1;
flag = flag | PXAIO_COMDD_LDGO_LDMOD;
}
static uint32_t cmd [11];
int len = 0;
int ret;
cmd[++len] = PXAIO_COMDI_DSADR | PXAIO_COMDD_DSADR ((x1*2+((long)960L*y1)));
cmd[++len] = PXAIO_COMDI_DVPIX | PXAIO_COMDD_DVPIX (dy);
cmd[++len] = PXAIO_COMDI_DHPIX | PXAIO_COMDD_DHPIX (dx);
cmd[++len] = PXAIO_COMDI_LBINI | PXAIO_COMDD_LBINI (ini);
cmd[++len] = PXAIO_COMDI_LBK2 | PXAIO_COMDD_LBK2 (bk2);
cmd[++len] = PXAIO_COMDI_FILL | PXAIO_COMDD_FILL (color);
cmd[++len] = PXAIO_COMDI_LDGO | flag;
cmd[0] = len;
if ((ret = ioctl (fd, TC6393FB_ACC_CMD_WRITE, cmd)) < 0)
perror ("ioctl");
// printf ("TC6393FB_ACC_CMD_WRITE returned %d\n", ret);
if ((ret = ioctl (fd, TC6393FB_ACC_SYNC, 0)) < 0)
perror("ioctl");
There are two unresolved issues: cursor movement and area stretching.
Last one is very hard to resolve because TC6393 hangs in case of wrong scaling parameters.
--
Happy hacking,
Eugene.