source: titan/titan/mipselport.h @ 37116

Last change on this file since 37116 was 37116, checked in by gost, 7 years ago

[titan] fix animatio position

File size: 37.8 KB
Line 
1#ifndef MIPSELPORT_H
2#define MIPSELPORT_H
3
4#ifndef FBIO_BLIT
5//#define FBIO_SET_MANUAL_BLIT _IOW('F', 0x20, __u32)
6#define FBIO_SET_MANUAL_BLIT _IOW('F', 0x21, __u8)
7#define FBIO_BLIT 0x22
8#endif
9
10#ifndef FBIO_WAITFORVSYNC
11#define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
12#endif
13
14//fuer Funktion memcpy_word
15volatile char *memcpy_word_src;
16volatile char *memcpy_word_dest;
17volatile long  memcpy_word_anzw = 0;
18
19//fuer Funktion memcpy_byte
20volatile char *memcpy_byte_src;
21volatile char *memcpy_byte_dest;
22volatile long  memcpy_byte_anzb = 0;
23
24unsigned char *lfb = NULL;
25int g_manual_blit = 0;
26struct fb_fix_screeninfo fix_screeninfo;
27struct fb_var_screeninfo var_screeninfo;
28
29void memcpy_area(unsigned char* targetADDR, unsigned char* startADDR, long pxAbs, long hight, long widthAbs, long FBwidthAbs);
30
31int setmixer(struct dvbdev* node, int left, int right)
32{
33        return audiosetmixer(node, left, right);
34}
35
36int setencoding(struct channel* chnode, struct dvbdev* videonode)
37{
38        int ret = 1;
39        if(chnode == NULL) return ret;
40       
41        switch(chnode->videocodec)
42        {
43                case MPEGV:
44                        ret = videosetstreamtype(videonode, 0);
45                        break;
46                case MPEG4V:
47                        ret = videosetstreamtype(videonode, 4);
48                        break;
49                case H264:
50                        ret = videosetstreamtype(videonode, 1);
51                        break;
52                case VC1:
53                        ret = videosetstreamtype(videonode, 3);
54                        break;
55                default:
56                        ret = videosetstreamtype(videonode, 0);
57        }
58        return ret;
59}
60
61int videodiscontinuityskip(struct dvbdev* node, int flag)
62{
63        return 0;
64}
65
66void fbsave()
67{
68}
69
70void fbrestore()
71{
72}
73
74void setfbvarsize(struct fb* newnode)
75{
76        if(newnode != NULL)
77                newnode->varfbsize = 1920 * 1080 * newnode->colbytes;
78//              newnode->varfbsize = 1920 * 1080 * (newnode->colbytes * 8);
79
80}
81
82void enablemanualblit()
83{
84        unsigned char tmp = 1;
85        if (ioctl(fb->fd, FBIO_SET_MANUAL_BLIT, &tmp)<0)
86                perror("FBIO_SET_MANUAL_BLIT");
87        else
88                g_manual_blit = 1;
89}
90
91void disablemanualblit()
92{
93        unsigned char tmp = 0;
94        if (ioctl(fb->fd, FBIO_SET_MANUAL_BLIT, &tmp)<0)
95                perror("FBIO_SET_MANUAL_BLIT");
96        else
97                g_manual_blit = 0;
98}
99
100void blit()
101{
102        if (g_manual_blit == 1) {
103                if (ioctl(fb->fd, FBIO_BLIT) < 0)
104                        perror("FBIO_BLIT");
105        }
106}
107
108int waitvsync()
109{
110        int c = 0;
111        return ioctl(fb->fd, FBIO_WAITFORVSYNC, &c);
112}
113
114void fbsetoffset(int x, int y)
115{
116        struct fb_var_screeninfo var_screeninfo;
117
118        var_screeninfo.xoffset = x;
119        var_screeninfo.yoffset = y;
120
121        if(ioctl(fb->fd, FBIOPAN_DISPLAY, &var_screeninfo) < 0)
122        {
123                perr("FBIOPAN_DISPLAY");
124        }
125}
126
127//flag 0 = no animation
128//flag 1 = animation
129void blitfb2(struct fb* fbnode, int flag)
130{
131        int doblit = 1;
132        struct fb_var_screeninfo var_screeninfo;
133
134        var_screeninfo.xres_virtual = fb->width;
135        var_screeninfo.xres = fb->width;
136        var_screeninfo.yres_virtual = fb->height * 2;
137        var_screeninfo.yres = fb->height;
138        var_screeninfo.height = 0;
139        var_screeninfo.width = 0;
140        var_screeninfo.xoffset = 0;
141        var_screeninfo.yoffset = 0;
142        var_screeninfo.bits_per_pixel = fb->colbytes * 8;
143       
144        switch(fb->colbytes)
145        {
146                case 2:
147                        var_screeninfo.transp.offset = 15;
148                        var_screeninfo.transp.length = 1;
149                        var_screeninfo.red.offset = 10;
150                        var_screeninfo.red.length = 5;
151                        var_screeninfo.green.offset = 5;
152                        var_screeninfo.green.length = 5;
153                        var_screeninfo.blue.offset = 0;
154                        var_screeninfo.blue.length = 5;
155                        break;
156                case 4:
157                        var_screeninfo.transp.offset = 24;
158                        var_screeninfo.transp.length = 8;
159                        var_screeninfo.red.offset = 16;
160                        var_screeninfo.red.length = 8;
161                        var_screeninfo.green.offset = 8;
162                        var_screeninfo.green.length = 8;
163                        var_screeninfo.blue.offset = 0;
164                        var_screeninfo.blue.length = 8;
165                        break;
166        }
167       
168        debug(444, "FB: line_length %d", fix_screeninfo.line_length);
169        debug(444, "FB: var_screeninfo.xres %d", var_screeninfo.xres);
170        debug(444, "FB: var_screeninfo.yres %d", var_screeninfo.yres);
171        debug(444, "FB: var_screeninfo.xres_virt %d", var_screeninfo.xres_virtual);
172        debug(444, "FB: var_screeninfo.yres_virt %d", var_screeninfo.yres_virtual);
173        debug(444, "FB: var_screeninfo.xoffset %d", var_screeninfo.xoffset);
174        debug(444, "FB: var_screeninfo.yoffset %d", var_screeninfo.yoffset);
175        debug(444, "FB: var_screeninfo.bits_per_pixel %d", var_screeninfo.bits_per_pixel);
176        debug(444, "FB: var_screeninfo.grayscale %d", var_screeninfo.grayscale);
177
178        if(ioctl(fb->fd, FBIOPUT_VSCREENINFO, &var_screeninfo) < 0)
179        {
180                var_screeninfo.yres_virtual = fb->height;
181                if(ioctl(fb->fd, FBIOPUT_VSCREENINFO, &var_screeninfo) < 0)
182                {
183                        perr("FBIOPUT_VSCREENINFO");
184                }
185                debug(444, "FB: double buffering not available");
186        }
187        else
188        {
189                debug(444, "FB: double buffering available!");
190        }
191
192        ioctl(fb->fd, FBIOGET_VSCREENINFO, &var_screeninfo);
193        if ((var_screeninfo.xres!=fb->width) && (var_screeninfo.yres!=fb->height) && (var_screeninfo.bits_per_pixel!=fb->colbytes))
194        {
195                debug(444, "SetMode failed: wanted: %dx%dx%d, got %dx%dx%d",
196                        fb->width, fb->height, fb->colbytes,
197                        var_screeninfo.xres, var_screeninfo.yres, var_screeninfo.bits_per_pixel);
198        }
199       
200        int posx = 0;
201        int posy = 0;
202        int width = 0;
203        int height = 0;
204       
205        if(status.bcm == 1 && status.usedirectfb == 0)
206        {
207                width = (fb->width - posx) - (getconfigint("fbrightoffset", NULL) * 5);
208                height = (fb->height - posy) - (getconfigint("fbbottomoffset", NULL) * 5);
209                posx = getconfigint("fbleftoffset", NULL) * 5;
210                posy = getconfigint("fbtopoffset", NULL) * 5;
211        }
212        else
213        {
214                width = (720 - posx) - (getconfigint("fbrightoffset", NULL));
215                height = (576 - posy) - (getconfigint("fbbottomoffset", NULL));
216                posx = getconfigint("fbleftoffset", NULL);
217                posy = getconfigint("fbtopoffset", NULL);
218        }
219       
220        //printf("posx:%i posy:%i width:%i height:%i\n", posx, posy, width, height);
221
222        int i = 0, max = 1, wstep = 0, hstep = 0;
223        int dst_left = 0, dst_width = 0, dst_top = 0, dst_height = 0;
224        int mode3d = 0;
225
226        if(flag == 0)
227        {
228                if(status.bcm == 1 && status.usedirectfb == 0)
229                        bcm_accel_blit(skinfb->data_phys, skinfb->width, skinfb->height, skinfb->pitch, 0, fb->data_phys, fb->width, fb->height, fb->pitch, 0, 0, skinfb->width, skinfb->height, posx, posy, width, height, 0, 0);
230                else
231                        blit();
232        }
233       
234        if(flag == 1 && status.screenanim > 0 && mode3d == 0)
235        {
236                doblit = 0;
237                max = 25;
238                dst_left = posx;
239                dst_width = width;
240                dst_top = posy;
241                dst_height = height;
242               
243                char* fbleftdev = "/proc/stb/fb/dst_left";
244                char* fbwidthdev = "/proc/stb/fb/dst_width";
245                char* fbtopdev = "/proc/stb/fb/dst_top";
246                char* fbheightdev = "/proc/stb/fb/dst_height";
247                       
248                if(status.screenanim == 1 || status.screenanim == 3)
249                {
250                        dst_left = (width / 2) - 1;
251                        dst_width = 2;
252                }
253                if(status.screenanim == 2 || status.screenanim == 3)
254                {
255                        dst_top = (height / 2) - 1;
256                        dst_height = 2;
257                }
258                wstep = width / max;
259                hstep = height / max;
260                       
261                for(i = 0; i <= max; i++)
262                {
263                        if(status.screenanim == 1 || status.screenanim == 3)
264                        {
265                                int tmpleft = dst_left - (wstep/2);
266                                int tmpwidth = dst_width + wstep;
267                                if(tmpleft < posx)
268                                        tmpleft = posx;
269                                if(tmpwidth > width)
270                                        tmpwidth = width;
271                                dst_left = tmpleft;
272                                dst_width = tmpwidth;
273                        }
274                        if(status.screenanim == 2 || status.screenanim == 3)
275                        {
276                                int tmptop = dst_top - (hstep/2);
277                                int tmpheight = dst_height + hstep;
278                                if(tmptop < posy)
279                                        tmptop = posy;
280                                if(tmpheight > height)
281                                        tmpheight = height;
282                                dst_top = tmptop;
283                                dst_height = tmpheight;
284                        }
285                       
286                        if((dst_width + dst_left) > width)
287                                dst_width = dst_width - dst_left;
288                                                       
289                        if((dst_height + dst_top) > height)
290                                dst_height = dst_height - dst_top;
291                                                               
292                        if(status.screenanim > 0) usleep(status.screenanimspeed * 1000);
293                       
294                        //printf("left:%i width:%i top:%i height:%i\n", dst_left, dst_width, dst_top, dst_height);
295                        waitvsync();
296                        if(status.bcm == 1 && status.usedirectfb == 0)
297                                bcm_accel_blit(skinfb->data_phys, skinfb->width, skinfb->height, skinfb->pitch, 0, fb->data_phys, fb->width, fb->height, fb->pitch, 0, 0, skinfb->width, skinfb->height, dst_left, dst_top, dst_width, dst_height, 0, 0);
298                        else
299                        {
300                                setfbosddev(fbleftdev, dst_left);
301                                setfbosddev(fbwidthdev, dst_width);
302                                setfbosddev(fbtopdev, dst_top);
303                                setfbosddev(fbheightdev, dst_height);
304                        }
305                        blit();
306                }
307        }
308        else
309                bcm_accel_blit(skinfb->data_phys, skinfb->width, skinfb->height, skinfb->pitch, 0, fb->data_phys, fb->width, fb->height, fb->pitch, 0, 0, skinfb->width, skinfb->height, posx, posy, width, height, 0, 0);
310       
311        if(doblit == 1)
312                blit();
313       
314/*     
315        int xRes, yRes, stride, bpp;
316       
317        xRes=var_screeninfo.xres;
318        yRes=var_screeninfo.yres;
319        bpp=var_screeninfo.bits_per_pixel;
320//      fb_fix_screeninfo fix;
321//      struct fb_fix_screeninfo fix_screeninfo;
322        if (ioctl(fb->fd, FBIOGET_FSCREENINFO, &fix_screeninfo)<0)
323        {
324                perror("FBIOGET_FSCREENINFO");
325                printf("fb failed\n");
326        }
327        stride=fix_screeninfo.line_length;
328        memset(lfb, 0, stride*yRes);
329*/
330//      blit();
331       
332/*
333        int i = 0, max = 1, wstep = 0, hstep = 0, ret = 0;
334        unsigned char buf[10];
335
336        if(fbnode == NULL) return;
337#ifndef NOHWBLIT
338        if(fbnode == fb) return;
339
340        if(status.rguidfd > -1)
341        {
342                m_lock(&status.accelfbmutex, 16);
343               
344                int zlen = 0;
345                char* zbuf = NULL;
346                blitscale(0, 0, fbnode->width, fbnode->height, 440, 330, 1);
347                ret = ozip((char*)accelfb->fb, 440 * 330 * 4, &zbuf, &zlen, 1);
348
349                if(ret == 0)
350                {
351                        memset(buf, 0, 10);
352                        char* tmpnr = oitoa(zlen);
353                        memcpy(buf, tmpnr, strlen(tmpnr));
354                        free(tmpnr); tmpnr = NULL;
355                        socksend(&status.rguidfd, buf, 10, 5000 * 1000);
356                        socksend(&status.rguidfd, (unsigned char*)zbuf, zlen, 5000 * 1000);
357                }
358                free(zbuf); zbuf = NULL;
359                zlen = 0;
360
361                m_unlock(&status.accelfbmutex, 16);
362        }
363
364        if(status.write_png == 1 && status.infobaraktiv == 0)
365        {
366                m_lock(&status.accelfbmutex, 16);
367                blitscale(0, 0, fbnode->width, fbnode->height, 320, 240, 1);
368                if(writeFBfile.ActBuf == NULL)
369                {
370                        writeFBfile.buf1 = malloc(4 * 320 * 240);
371                        writeFBfile.ActBuf = writeFBfile.buf1;
372                        memcpy(writeFBfile.buf1, accelfb->fb, 4 * 320 * 240);
373                        addtimer(&fb2png_thread, START, 10000, 1, NULL, NULL, NULL);
374                }
375                else if(writeFBfile.buf1 == writeFBfile.ActBuf)
376                {
377                        if(writeFBfile.buf2 == NULL)
378                                writeFBfile.buf2 = malloc(4 * 320 * 240);
379                        memcpy(writeFBfile.buf2, accelfb->fb, 4 * 320 * 240);
380                }
381                else if(writeFBfile.buf2 == writeFBfile.ActBuf)
382                {
383                        if(writeFBfile.buf1 == NULL)
384                                writeFBfile.buf1 = malloc(4 * 320 * 240);
385                        memcpy(writeFBfile.buf1, accelfb->fb, 4 * 320 * 240);
386                }
387                m_unlock(&status.accelfbmutex, 16);
388        }
389
390        int mode3d = 0, leftoffset = 0, rightoffset = 0, topoffset = 0, bottomoffset = 0;
391        char* mode3dstr = NULL;
392
393        if(status.leftoffset != 0) blitrect(0, 0, status.leftoffset, fb->height, 0, 255, 2);
394        if(status.rightoffset != 0) blitrect(fb->width - status.rightoffset, 0, status.rightoffset, fb->height, 0, 255, 2);
395        if(status.topoffset != 0) blitrect(0, 0, fb->width, status.topoffset, 0, 255, 2);
396        if(status.bottomoffset != 0) blitrect(0, fb->height - status.bottomoffset, fb->width, status.bottomoffset, 0, 255, 2);
397
398        mode3dstr = getconfig("av_mode3d", NULL);
399        if(ostrcmp(mode3dstr, "sbs") == 0)
400                mode3d = 1;
401        else if(ostrcmp(mode3dstr, "tab") == 0)
402                mode3d = 2;
403
404        STMFBIO_BLT_DATA  bltData;
405        memset(&bltData, 0, sizeof(STMFBIO_BLT_DATA));
406
407        bltData.operation  = BLT_OP_COPY;
408        bltData.srcOffset  = fbnode->fb - fb->fb;
409        bltData.srcPitch   = fbnode->pitch;
410        bltData.src_top    = 0;
411        bltData.src_left   = 0;
412        bltData.src_right  = fbnode->width;
413        bltData.src_bottom = fbnode->height;
414        bltData.srcFormat  = SURF_BGRA8888;
415        bltData.srcMemBase = STMFBGP_FRAMEBUFFER;
416
417        bltData.dstOffset  = 0;
418        bltData.dstPitch   = fb->pitch;
419        bltData.dst_left   = status.leftoffset;
420        bltData.dst_top    = status.topoffset;
421        if(mode3d == 1)
422                bltData.dst_right = (fb->width - status.rightoffset) / 2;
423        else
424                bltData.dst_right = fb->width - status.rightoffset;
425        if(mode3d == 2)
426                bltData.dst_bottom = (fb->height - status.bottomoffset) / 2;
427        else
428                bltData.dst_bottom = fb->height - status.bottomoffset;
429        bltData.dstFormat  = SURF_BGRA8888;
430        bltData.dstMemBase = STMFBGP_FRAMEBUFFER;
431
432        if(flag == 1 && status.screenanim > 0 && mode3d == 0)
433        {
434                int width = (fb->width - status.rightoffset) - status.leftoffset;
435                int height = (fb->height - status.topoffset) - status.bottomoffset;
436                max = 25;
437                if(status.screenanim == 1 || status.screenanim == 3)
438                {
439                        bltData.dst_left = (width / 2) - 1;
440                        bltData.dst_right = (width / 2) + 1;
441                }
442                if(status.screenanim == 2 || status.screenanim == 3)
443                {
444                        bltData.dst_top = (height / 2) - 1;
445                        bltData.dst_bottom = (height / 2) + 1;
446                }
447                wstep = width / max;
448                hstep = height / max;
449        }
450
451        for(i = 0; i < max; i++)
452        {
453
454                if(status.screenanim == 1 || status.screenanim == 3)
455                {
456                        int tmpleft = bltData.dst_left - wstep;
457                        int tmpright = bltData.dst_right + wstep;
458                        if(tmpleft < status.leftoffset)
459                                tmpleft = status.leftoffset;
460                        if(tmpright > fb->width - status.rightoffset)
461                                tmpright = fb->width - status.rightoffset;
462                        bltData.dst_left = tmpleft;
463                        bltData.dst_right = tmpright;
464                }
465
466                if(status.screenanim == 2 || status.screenanim == 3)
467                {
468                        int tmptop = bltData.dst_top - hstep;
469                        int tmpbottom = bltData.dst_bottom + hstep;
470                        if(tmptop < status.topoffset)
471                                tmptop = status.topoffset;
472                        if(tmpbottom > fb->height - status.bottomoffset)
473                                tmpbottom = fb->height - status.bottomoffset;
474                        bltData.dst_top = tmptop;
475                        bltData.dst_bottom = tmpbottom;
476                }
477
478                if(status.screenanim > 0) usleep(status.screenanimspeed * 1000);
479
480                if (ioctl(fb->fd, STMFBIO_BLT, &bltData) < 0)
481                {
482                        perr("ioctl STMFBIO_BLT");
483                }
484                if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
485                {
486                        perr("ioctl STMFBIO_SYNC_BLITTER");
487                }
488
489                if(mode3d != 0)
490                {
491                        if(mode3d == 1)
492                                bltData.dst_left = 0 + status.leftoffset + ((fb->width - status.rightoffset) / 2);
493                        if(mode3d == 2)
494                                bltData.dst_top = 0 + status.topoffset + ((fb->height - status.bottomoffset) / 2);
495                        bltData.dst_right  = fb->width - status.rightoffset;
496                        bltData.dst_bottom = fb->height - status.bottomoffset;
497
498                        if (ioctl(fb->fd, STMFBIO_BLT, &bltData) < 0)
499                        {
500                                perr("ioctl STMFBIO_BLT");
501                        }
502                        if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
503                        {
504                                perr("ioctl STMFBIO_SYNC_BLITTER");
505                        }
506                }
507        }
508#else
509#ifdef NOFB
510        if(status.rguidfd > -1)
511        {
512                char* buf = NULL;
513                buf = scale(fbnode->fb, fbnode->width, fbnode->height, 4, 320, 240, 0);
514                if(buf != NULL)
515                {
516                        socksend(&status.rguidfd, (unsigned char*)buf, 320 * 240 * 4, 5000 * 1000);
517                        free(buf); buf = NULL;
518                }
519        }
520        if(status.write_png == 1 && status.infobaraktiv == 0)
521        {
522                char* buf = NULL;
523                buf = scale(fbnode->fb, fbnode->width, fbnode->height, 4, 320, 240, 0);
524                if(buf != NULL)
525                {
526                        if(writeFBfile.ActBuf == NULL)
527                        {
528                                writeFBfile.buf1 = malloc(4 * 320 * 240);
529                                writeFBfile.ActBuf = writeFBfile.buf1;
530                                memcpy(writeFBfile.buf1, (unsigned char*)buf, 4 * 320 * 240);
531                                addtimer(&fb2png_thread, START, 10000, 1, NULL, NULL, NULL);
532                        }
533                        else if(writeFBfile.buf1 == writeFBfile.ActBuf)
534                        {
535                                if(writeFBfile.buf2 == NULL)
536                                        writeFBfile.buf2 = malloc(4 * 320 * 240);
537                                memcpy(writeFBfile.buf2, (unsigned char*)buf, 4 * 320 * 240);
538                        }
539                        else if(writeFBfile.buf2 == writeFBfile.ActBuf)
540                        {
541                                if(writeFBfile.buf1 == NULL)
542                                        writeFBfile.buf1 = malloc(4 * 320 * 240);
543                                memcpy(writeFBfile.buf1, (unsigned char*)buf, 4 * 320 * 240);
544                        }
545                        //fb2png((unsigned char*)buf, 320, 240, "/tmp/titanlcd.png");
546                        free(buf); buf = NULL;
547                }
548        }
549
550        if(fbnode != fb)
551        {
552                for(i = 0; i < fbnode->height; i++)
553                {
554                        memcpy(fb->fb + (i * fb->pitch), fbnode->fb + (i * fbnode->pitch), fbnode->width * fbnode->colbytes);
555                }
556        }
557        system("killall -9 xloadimage");
558
559        FILE *fd;
560        fd=fopen("titan.png", "w");
561        fwrite(fb->fb, fb->varfbsize, 1, fd);
562        fclose(fd);
563
564        system("fbgrab -f titan.png -w 1280 -h 720 -b 32 titan1.png > /dev/null");
565        system("xloadimage titan1.png > /dev/null &");
566#endif
567#endif
568*/
569}
570
571void setfbtransparent(int value)
572{
573        char* transparentdev;
574
575        transparentdev = getconfig("transparentdev", NULL);
576
577        if(transparentdev != NULL /*&& checkdev(transparentdev)*/)
578        {
579                debug(100, "set %s to %d", transparentdev, value);
580                writesysint(transparentdev, value, 1);
581                return;
582        }
583/*
584#ifndef SIMULATE
585        struct stmfbio_var_screeninfo_ex varEx = {0};
586
587        varEx.layerid  = 0;
588        varEx.activate = STMFBIO_ACTIVATE_IMMEDIATE;
589        varEx.caps = STMFBIO_VAR_CAPS_OPACITY;
590        varEx.opacity = value;
591
592
593        if(ioctl(fb->fd, STMFBIO_SET_VAR_SCREENINFO_EX, &varEx) < 0)
594                perr("STMFBIO_SET_VAR_SCREENINFO_EX");
595#endif
596*/
597}
598
599int allocbpamem(size_t size, int *memfd, unsigned char **mem)
600{
601        return -1;
602}
603
604void freebpamem(int memfd, unsigned char* mem, size_t len)
605{
606}
607
608//mode 0: with fill (draw to skinfb)
609//mode 1: without fill (draw to skinfb)
610//mode 2: with fill (draw to fb)
611//mode 3: without fill (draw to fb)
612void blitrect(int posx, int posy, int width, int height, long color, int transparent, int mode)
613{
614        int y, x;
615        unsigned long tmpcol;
616        struct fb* tmpfb = NULL;
617       
618        if(posx < 0) posx = 0;
619        if(posy < 0) posy = 0;
620        if(mode < 2)
621                tmpfb = skinfb;
622        else
623                tmpfb = fb;
624               
625        if(posx > tmpfb->width) posx = tmpfb->width;
626        if(posy > tmpfb->height) posy = tmpfb->height;
627        if(posx + width > tmpfb->width) width = tmpfb->width - posx;
628        if(posy + height > tmpfb->height) height = tmpfb->height - posy;
629
630        if(width <= 0 || height <= 0) return;
631
632        transparent = (transparent - 255) * -1;
633        tmpcol = color | ((transparent & 0xff) << 24);
634
635        if(mode == 0 || mode == 2)
636        {
637               
638                if(status.bcm == 1 && tmpfb->data_phys != 0)
639                {
640                        bcm_accel_fill(tmpfb->data_phys, tmpfb->width, tmpfb->height, tmpfb->pitch, posx, posy, width, height, tmpcol);
641                }
642                else
643                {
644                        int yend = (posy + height) * tmpfb->width;
645                        posy *= tmpfb->width;
646                        int xend = posx + width;
647//              int xlen = (xend - posx) * tmpfb->colbytes;
648                        int r = 0;
649                        unsigned char* from = tmpfb->fb + (posy + posx) * tmpfb->colbytes;
650
651                        for(y = posy; y < yend; y += tmpfb->width)     
652                        {
653                                if(r == 0)
654                                {
655                                        r = 1;
656                                        for(x = posx; x < xend; x++)
657                                                drawpixelfastfb(tmpfb, x, y, tmpcol);
658                                }
659                                else
660                                {
661                                        //memcpy(tmpfb->fb + (y + posx) * tmpfb->colbytes, from, xlen);
662                                memcpy_area(tmpfb->fb + (y + posx) * tmpfb->colbytes, from, posx * 4, height-1, width*4, tmpfb->width*4);
663                                        y = yend;
664                                }
665                               
666                        }
667                }
668        }
669        else if(mode == 1 || mode == 3)
670        {
671                //topline
672                for(x = 0; x < width; x++)
673                        drawpixelfb(tmpfb, posx + x, posy, tmpcol);
674                //bottomline
675                for(x = 0; x < width; x++)
676                        drawpixelfb(tmpfb, posx + x, posy + height - 1, tmpcol);
677                //leftline
678                for(y = 0; y < height; y++)
679                        drawpixelfb(tmpfb, posx, posy + y, tmpcol);
680                //rightline
681                for(y = 0; y < height; y++)
682                        drawpixelfb(tmpfb, posx + width - 1, posy + y, tmpcol);
683        }
684
685/*
686        unsigned long tmpcol;
687
688        transparent = (transparent - 255) * -1;
689        tmpcol = color | ((transparent & 0xff) << 24);
690
691        STMFBIO_BLT_DATA  bltData;
692        memset(&bltData, 0, sizeof(STMFBIO_BLT_DATA));
693
694        if(posx < 0) posx = 0;
695        if(posy < 0) posy = 0;
696        if(mode < 2)
697        {
698                if(posx > skinfb->width) posx = skinfb->width;
699                if(posy > skinfb->height) posy = skinfb->height;
700                if(posx + width > skinfb->width) width = skinfb->width - posx;
701                if(posy + height > skinfb->height) height = skinfb->height - posy;
702        }
703        else
704        {
705                if(posx > fb->width) posx = fb->width;
706                if(posy > fb->height) posy = fb->height;
707                if(posx + width > fb->width) width = fb->width - posx;
708                if(posy + height > fb->height) height = fb->height - posy;
709        }
710
711        if(width <= 0 || height <= 0) return;
712
713        if(mode == 0 || mode == 2)
714                bltData.operation  = BLT_OP_FILL;
715        else if(mode == 1 || mode == 3)
716                bltData.operation  = BLT_OP_DRAW_RECTANGLE;
717        bltData.colour     = tmpcol;
718        bltData.srcFormat  = SURF_ARGB8888;
719        bltData.srcMemBase = STMFBGP_FRAMEBUFFER;
720
721        if(status.usedirectfb == 1)
722                bltData.dstOffset  = 0;
723        else
724        {
725                if(mode < 2)
726                        bltData.dstOffset  = fb->varfbsize;
727                else
728                        bltData.dstOffset  = 0;
729        }
730        if(mode < 2)
731                bltData.dstPitch   = skinfb->pitch;
732        else
733                bltData.dstPitch   = fb->pitch;
734        bltData.dst_top    = posy;
735        bltData.dst_left   = posx;
736        bltData.dst_bottom = posy + height;
737        bltData.dst_right  = posx + width;
738        bltData.dstFormat  = SURF_ARGB8888;
739        bltData.dstMemBase = STMFBGP_FRAMEBUFFER;
740
741        if(ioctl(fb->fd, STMFBIO_BLT, &bltData) < 0)
742        {
743                perr("ioctl STMFBIO_BLT");
744        }
745        if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
746        {
747                perr("ioctl STMFBIO_SYNC_BLITTER");
748        }
749*/
750}
751
752int readjpg(const char* filename, unsigned long* width, unsigned long* height, unsigned long* rowbytes, int* channels, unsigned char **mem, int *memfd)
753{
754/*
755#ifndef SIMULATE
756        FILE *fp;
757        unsigned int temp1, temp2;
758
759        if(filename == NULL) return -1;
760
761        debug(200, "hardware decode picture (%s)...", filename);
762
763        if (!(fp = fopen(filename, "rb")))
764                return -1;
765         
766        if(get_jpeg_img_size(fp, &temp1, &temp2) != LIBMMEIMG_SUCCESS)
767                return -1;
768       
769        *width = temp1;
770        *height = temp2;
771        *channels = 3;
772        *rowbytes = *channels * temp1;
773       
774        if(allocbpamem(temp1 * temp2 * (*channels), memfd, mem) != 0)
775        {
776                fclose(fp);
777                return -1;
778        }
779               
780        if(decode_jpeg_noalloc(fp, temp1, temp2, temp1, temp2, (char *)*mem, 1) == LIBMMEIMG_SUCCESS)
781        {
782                fclose(fp);
783                return 0;
784        }
785       
786        fclose(fp);
787        freebpamem(*memfd, *mem, temp1 * temp2 * (*channels));
788        err("hardware decode error");
789#endif
790        return -1;
791*/
792return -1;
793}
794
795//flag 0: blit from accelfb to skinfb
796//flag 1: blit from skinfb to accelfb
797void blitscale(int posx, int posy, int width, int height, int scalewidth, int scaleheight, int flag)
798{
799#ifndef SIMULATE
800//#ifdef BLITHELP
801        unsigned char *source = NULL;
802        unsigned char *target = NULL;
803        int zpitch = 0;
804        int zheight = 0;
805        int zwidth = 0;
806        int qpitch = 0;
807        int qheight = 0;
808        int qwidth = 0;
809        unsigned long source_phys = 0;
810        unsigned long target_phys = 0;
811
812        if(scalewidth == 0) scalewidth = width;
813        if(scaleheight == 0) scaleheight = height;
814
815        if(posx < 0) posx = 0;
816        if(posx > skinfb->width) posx = skinfb->width;
817        if(posy < 0) posy = 0;
818        if(posy > skinfb->height) posy = skinfb->height;
819        if(posx + scalewidth > skinfb->width) scalewidth = skinfb->width - posx;
820        if(posy + scaleheight > skinfb->height) scaleheight = skinfb->height - posy;
821       
822        if(width <= 0 || height <= 0 || scalewidth <= 0 || scaleheight <= 0) return;
823       
824        if(flag == 1 && (scalewidth * scaleheight * 4) > accelfb->varfbsize)
825        {
826                err("accelfb to small %d -> %lu ", scalewidth * scaleheight * 4, accelfb->varfbsize);
827                return;
828        }
829        if(flag == 0)
830        {
831                source = accelfb->fb;
832                source_phys = accelfb->data_phys;
833                target_phys = skinfb->data_phys;
834
835                target = skinfb->fb + (posy * skinfb->pitch) + (posx*4);
836                zpitch = skinfb->pitch;
837                zheight = skinfb->height;
838                zwidth = skinfb->width;
839                qpitch = width*4;
840                qheight = height;
841                qwidth = width;
842        }
843        else
844        {
845                source = skinfb->fb;
846                source_phys = skinfb->data_phys;
847                target_phys = accelfb->data_phys;
848
849                target = accelfb->fb + (posy * accelfb->pitch) + (posx*4);
850                zpitch = accelfb->pitch;
851                zheight = accelfb->height;
852                zwidth = accelfb->width;
853                qpitch = width*4;
854                qheight = height;
855                qwidth = width;
856        }
857       
858        if(status.bcm == 1 && source_phys > 0 && target_phys >0)
859        {
860                bcm_accel_blit(source_phys, qwidth, qheight, qpitch, 0, target_phys, zwidth, zheight, zpitch, 0, 0, width, height, posx, posy, scalewidth, scaleheight, 0, 0);
861                flag = 1;
862        }
863        else
864        {
865                unsigned char *helpbuf = NULL;
866                helpbuf = scale(source, width, height, 4, scalewidth, scaleheight, 0);
867       
868                size_t helpb = 0;
869                size_t helpz = 0;
870                size_t help = 0;
871       
872                while(helpz < scaleheight && helpz < (zheight - posy)) {
873                        //memcpy(target[help], helpbuf[helpb], scalewidth*4);
874                        memcpy(target+help, helpbuf+helpb, scalewidth*4);
875                        help = help + zpitch;
876                        helpb = helpb + scalewidth*4;
877                        helpz = helpz + 1;
878                }
879                free(helpbuf);
880        }
881       
882       
883        if(flag == 0)
884                blit();
885
886//#endif
887
888/*
889        STMFBIO_BLT_DATA  blt_data;
890        memset(&blt_data, 0, sizeof(STMFBIO_BLT_DATA));
891
892        if(scalewidth == 0) scalewidth = width;
893        if(scaleheight == 0) scaleheight = height;
894
895        if(posx < 0) posx = 0;
896        if(posx > skinfb->width) posx = skinfb->width;
897        if(posy < 0) posy = 0;
898        if(posy > skinfb->height) posy = skinfb->height;
899        if(posx + scalewidth > skinfb->width) scalewidth = skinfb->width - posx;
900        if(posy + scaleheight > skinfb->height) scaleheight = skinfb->height - posy;
901       
902        if(width <= 0 || height <= 0 || scalewidth <= 0 || scaleheight <= 0) return;
903       
904        if(flag == 1 && (scalewidth * scaleheight * 4) > accelfb->varfbsize)
905        {
906                err("accelfb to small %d -> %lu ", scalewidth * scaleheight * 4, accelfb->varfbsize);
907                return;
908        }
909
910        blt_data.operation  = BLT_OP_COPY;
911       
912        if(flag == 0)
913        {
914                if(status.usedirectfb == 1)
915                        blt_data.srcOffset  = fb->varfbsize;
916                else
917                        blt_data.srcOffset  = fb->varfbsize + skinfb->varfbsize;
918        }
919        else
920        {
921                if(status.usedirectfb == 1)
922                        blt_data.srcOffset  = 0;
923                else
924                        blt_data.srcOffset  = fb->varfbsize;
925        }
926       
927        blt_data.srcPitch   = width * 4;
928        blt_data.src_top    = 0;
929        blt_data.src_left   = 0;
930        blt_data.src_right  = width;
931        blt_data.src_bottom = height;
932        blt_data.srcFormat  = SURF_ARGB8888;
933        blt_data.srcMemBase = STMFBGP_FRAMEBUFFER;
934       
935        if(flag == 0)
936        {
937                if(status.usedirectfb == 1)
938                {
939                        blt_data.dstOffset  = 0;
940                        blt_data.dstPitch   = fb->pitch;
941                }
942                else
943                {
944                        blt_data.dstOffset  = fb->varfbsize;
945                        blt_data.dstPitch   = skinfb->pitch;
946                }
947        }
948        else
949        {
950                if(status.usedirectfb == 1)
951                {
952                        blt_data.dstOffset  = fb->varfbsize;
953                        blt_data.dstPitch   = skinfb->pitch;
954                }
955                else
956                {
957                        blt_data.dstOffset  = fb->varfbsize + skinfb->varfbsize;
958                        blt_data.dstPitch   = scalewidth * 4;
959                }
960        }
961       
962        blt_data.dst_left   = posx;
963        blt_data.dst_top    = posy;
964        blt_data.dst_right  = posx + scalewidth;
965        blt_data.dst_bottom = posy + scaleheight;
966        blt_data.dstFormat  = SURF_ARGB8888;
967        blt_data.dstMemBase = STMFBGP_FRAMEBUFFER;
968       
969        if (ioctl(fb->fd, STMFBIO_BLT, &blt_data) < 0)
970        {
971                perr("ioctl STMFBIO_BLT");
972        }
973        if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
974        {
975                perr("ioctl STMFBIO_SYNC_BLITTER");
976        }
977*/
978#endif
979}
980
981void blitjpg(unsigned char* buf, int posx, int posy, int width, int height, int scalewidth, int scaleheight, int mwidth, int mheight, int halign, int valign)
982//void blitjpg(unsigned char* buf, int posx, int posy, int width, int height, int scalewidth, int scaleheight)
983{
984#ifndef SIMULATE
985#ifdef BLITHELP
986        unsigned char *helpbuf = NULL;
987        unsigned char *framebuf = NULL;
988
989        if(scalewidth != 0 || scaleheight != 0) {
990                helpbuf = scale(buf, width, height, 3, scalewidth, scaleheight, 1);
991                if(helpbuf == NULL)
992                        return;
993        }
994        else {
995                helpbuf = buf;
996                scalewidth = width;
997                scaleheight = height;
998        }
999        size_t helpb = 0;
1000        size_t helpz = 0;
1001        size_t help = 0;
1002       
1003        framebuf = skinfb->fb;
1004        framebuf = framebuf + (posy * skinfb->pitch) + (posx*4);
1005       
1006        while(helpz < scaleheight && helpz < (skinfb->height - posy)) {
1007                help = 0;
1008                while(help < (scalewidth*4) && help < (skinfb->pitch - (posx*4))) {
1009                        framebuf[help+0] = helpbuf[helpb+2];
1010                        framebuf[help+1] = helpbuf[helpb+1];
1011                        framebuf[help+2] = helpbuf[helpb+0];
1012                        framebuf[help+3] = 0xff;
1013                        help = help + 4;
1014                        helpb = helpb + 3;
1015                }
1016                if(help >= (skinfb->pitch - (posx*4)))
1017                        helpb = (helpz+1) * (scalewidth*3);
1018                framebuf = framebuf + skinfb->pitch;
1019                helpz = helpz + 1;
1020        }
1021        free(helpbuf);
1022        blit();
1023#endif
1024                 
1025/*
1026        STMFBIO_BLT_EXTERN_DATA blt_data;
1027        memset(&blt_data, 0, sizeof(STMFBIO_BLT_EXTERN_DATA));
1028
1029        blt_data.operation  = BLT_OP_COPY;
1030        blt_data.ulFlags    = 0;
1031        blt_data.srcOffset  = 0;
1032        blt_data.srcPitch   = width * 3;
1033        blt_data.dstOffset  = 0;
1034        blt_data.dstPitch   = skinfb->pitch;
1035        blt_data.src_top    = 0;
1036        blt_data.src_left   = 0;
1037        blt_data.src_right  = width;
1038        blt_data.src_bottom = height;
1039        blt_data.dst_left   = posx;
1040        blt_data.dst_top    = posy;
1041       
1042        if(scalewidth == 0)  scalewidth = width;
1043        if(scaleheight == 0) scaleheight = height;
1044       
1045        blt_data.dst_right  = posx + scalewidth;
1046        blt_data.dst_bottom = posy + scaleheight;
1047        blt_data.srcFormat  = SURF_BGR888;
1048        blt_data.dstFormat  = SURF_ARGB8888;
1049        blt_data.srcMemBase = (char *)buf;
1050        blt_data.dstMemBase = (char *)skinfb->fb;
1051        blt_data.srcMemSize = width * height * 3;
1052        blt_data.dstMemSize = skinfb->pitch * skinfb->height;
1053       
1054        if(ioctl(skinfb->fd, STMFBIO_BLT_EXTERN, &blt_data) < 0)
1055        {
1056                err("ioctl STMFBIO_BLT_EXTERN");
1057        }
1058        if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
1059        {
1060                perr("ioctl STMFBIO_SYNC_BLITTER");
1061        }
1062*/
1063
1064#endif
1065}
1066
1067void initsignal(struct sigaction* sa)
1068{
1069        sigaction(SIGILL, sa, NULL);
1070        sigaction(SIGBUS, sa, NULL);
1071        sigaction(SIGFPE, sa, NULL);
1072        sigaction(SIGUSR1, sa, NULL);
1073        sigaction(SIGSEGV, sa, NULL);
1074        sigaction(SIGUSR2, sa, NULL);
1075        sigaction(SIGPIPE, sa, NULL);
1076        sigaction(SIGALRM, sa, NULL);
1077//      sigaction(SIGSTKFLT, sa, NULL);
1078        sigaction(SIGABRT, sa, NULL);
1079
1080        signal(SIGHUP, SIG_IGN);
1081        signal(SIGINT, SIG_IGN);
1082        signal(SIGTRAP, SIG_IGN);
1083        signal(SIGXCPU, SIG_IGN);
1084        signal(SIGXFSZ, SIG_IGN);
1085        signal(SIGVTALRM, SIG_IGN);
1086        signal(SIGPROF, SIG_IGN);
1087        signal(SIGPOLL, SIG_IGN);
1088        signal(SIGRTMAX, SIG_IGN);
1089        signal(SIGPWR, SIG_IGN);
1090        signal(SIGSYS, SIG_IGN);
1091}
1092
1093void sighandler(int sig, struct sigcontext ctx)
1094{
1095        switch(sig)
1096        {
1097                case SIGALRM:
1098                {
1099                        err("got signal sigalrm but ignore it");
1100                        break;
1101                }
1102                case SIGPIPE:
1103                {
1104                        err("got signal sigpipe but ignore it");
1105                        break;
1106                }
1107                case SIGUSR1:
1108                {
1109                        //todo all configs
1110                        reloadconfig(status.configfile);
1111                        reloadconfig(getconfig("ownconfig", NULL));
1112                        break;
1113                }
1114                case SIGUSR2: //called if hanging mainthread detect
1115                {
1116                        debugstack(sig, NULL, NULL);
1117                        break;
1118                }
1119                case SIGILL:
1120                case SIGBUS:
1121                case SIGFPE:
1122                case SIGSEGV:
1123//              case SIGSTKFLT:
1124                {
1125/*
1126#ifdef SIMULATE
1127                        //intel
1128                        debugstack((void *)ctx.eip, NULL);
1129                        err("got signal %d, fault address 0x%lx from 0x%lx", sig, ctx.cr2, ctx.eip);
1130#else
1131                        // sh4
1132                        //unsigned long sc_regs[16];
1133                        //unsigned long sc_pc; //programm counter register
1134                        //unsigned long sc_pr; //procedure register
1135                        //unsigned long sc_sr; //status register
1136                        //unsigned long sc_gbr;
1137                        //unsigned long sc_mach;
1138                        //unsigned long sc_macl;
1139
1140                        debugstack(sig, (void *)ctx.sc_pr, (void *)ctx.sc_pc);
1141                        err("got signal %d (%s), programm counter reg: 0x%lx,  procedure reg: 0x%lx", sig, strsignal(sig), ctx.sc_pc, ctx.sc_pr);
1142#endif
1143*/
1144                        if(getconfigint("saverun", NULL) == 1 && status.longjumpbuf != NULL)
1145                                siglongjmp(status.longjumpbuf, 999);
1146                        else
1147                                exit(100);
1148                        break;
1149                }
1150        }
1151}
1152
1153int setvmpeg(struct dvbdev* node, int value, int flag)
1154{
1155        debug(4440, "in");
1156        char* vmpegdev = NULL, *tmpstr = NULL, *buf = NULL;
1157        int ret = 0;
1158
1159        if(node == NULL) return 1;
1160        if(flag == 0)  vmpegdev = getconfig("vmpegleftdev", NULL);
1161        if(flag == 1)  vmpegdev = getconfig("vmpegtopdev", NULL);
1162        if(flag == 2)  vmpegdev = getconfig("vmpegwidthdev", NULL);
1163        if(flag == 3)  vmpegdev = getconfig("vmpegheightdev", NULL);
1164        if(flag == 99) vmpegdev = getconfig("vmpegapplydev", NULL);
1165
1166        if(vmpegdev != NULL)
1167        {
1168                buf = malloc(MINMALLOC);
1169                if(buf == NULL)
1170                {
1171                        err("no mem");
1172                        return 1;
1173                }
1174               
1175                tmpstr = malloc(10);
1176                if(tmpstr == NULL)
1177                {
1178                        err("no mem");
1179                        free(buf);
1180                        return 1;
1181                }
1182               
1183                snprintf(buf, MINMALLOC, vmpegdev, node->devnr);
1184                snprintf(tmpstr, 10, "%x", value);
1185                debug(444, "set %s to %s", buf, tmpstr);
1186                status.tvpic = 1;
1187                ret = writesys(buf, tmpstr, 1);
1188               
1189                free(tmpstr);
1190                free(buf);
1191                return ret;
1192        }
1193
1194        debug(4440, "out");
1195        return 0;
1196}
1197
1198//flag 0: wh = width
1199//flag 1: wh = height
1200int setvmpegrect(struct dvbdev* node, int left, int top, int wh, int flag)
1201{
1202        int ret = 0;
1203       
1204        ret = setvmpeg(node, left, 0);
1205        ret = setvmpeg(node, top, 1);
1206       
1207        if(flag == 0)
1208        {
1209                ret = setvmpeg(node, wh, 2);
1210                ret = setvmpeg(node, wh / 1.4, 3);
1211        }
1212        if(flag == 1)
1213        {
1214                ret = setvmpeg(node, wh, 3);
1215                ret = setvmpeg(node, wh * 1.3, 2);
1216        }
1217               
1218        setvmpeg(node, 0, 99);
1219
1220        return ret;
1221}
1222
1223int resetvmpeg(struct dvbdev* node)
1224{
1225        int ret = 0;
1226
1227        ret = setvmpeg(node, 0, 0);
1228        ret = setvmpeg(node, 0, 1);
1229        ret = setvmpeg(node, 0, 2);
1230        ret = setvmpeg(node, 0, 3);
1231       
1232        ret = setvmpeg(node, 0, 99);
1233
1234        status.tvpic = 0;
1235                       
1236        return ret;
1237}
1238
1239int resettvpic()
1240{
1241/*
1242        if(status.tvpic == 1 && status.aktservice != NULL)
1243        {
1244                status.tvpic = 0;
1245                resetvmpeg(status.aktservice->videodev);
1246        }
1247*/
1248        int ret = 0;
1249
1250        if(status.tvpic > 0 && status.aktservice != NULL)
1251                ret = resetvmpeg(status.aktservice->videodev);
1252
1253        return ret;
1254}
1255
1256int cagetslotinfo(struct dvbdev* node, ca_slot_info_t* info)
1257{
1258        int ret = 0;
1259       
1260        if(node == NULL || info == NULL)
1261        {
1262                err("NULL detect");
1263                return 1;
1264        }
1265       
1266        struct pollfd fds;
1267       
1268        fds.fd = node->fd;
1269        fds.events = POLLOUT | POLLPRI | POLLIN;
1270       
1271        info->flags = 0;
1272       
1273        ret = TEMP_FAILURE_RETRY(poll(&fds, 1, 1000));
1274       
1275        if(ret < 0)
1276        {
1277                err("poll data");
1278                return 1; //error
1279        }
1280        else if(ret == 0)
1281                return 0; //timeout
1282        else if(ret > 0)
1283        {
1284                if(fds.revents & POLLOUT)
1285                        info->flags = CA_CI_MODULE_READY;
1286                if(fds.revents & POLLIN)
1287                        info->flags = CA_CI_MODULE_READY;
1288                if(fds.revents & POLLPRI)
1289                        info->flags = 0;
1290        }
1291
1292        return 0;
1293}
1294
1295void memcpy_word(char* dest, char* src, long anzw)
1296{
1297        // Folgende Werte m�ssen volatile definiert sein
1298        // char* memcpy_word_src ---> pointer Quelle
1299        // char* memcpy_word_dest ---> pointer Ziehl
1300        // long  memcpy_word_anzw ---> Anzahl der W�rter (4 byte) die kopiert werden sollen.
1301       
1302        memcpy_word_src = src;
1303        memcpy_word_dest = dest;
1304        memcpy_word_anzw = anzw;
1305
1306#ifndef ARM     
1307        asm(   
1308                                "               lw        $8, memcpy_word_src           \n"
1309                                "               lw        $9, memcpy_word_dest  \n"                             
1310                                "               lw              $10, memcpy_word_anzw   \n"             
1311                                "               addi    $10, $10, -1                                    \n"
1312                                "loop1:                                                                                                 \n"
1313                                "               lw        $11, ($8)                                                     \n"
1314                                "               sw        $11, ($9)                                                     \n"
1315                                "               addi    $8, $8, 4                                                       \n"
1316                                "               addi    $9, $9, 4                                                       \n"
1317                                "               addi    $10, $10, -1                                    \n"
1318                                "               bgez    $10, loop1                                              \n"
1319                        );
1320#endif
1321
1322}
1323
1324void memcpy_byte(char* dest, char* src, long anzb)
1325{
1326        // Folgende Werte m�ssen volatile definiert sein
1327        // char* memcpy_byte_src ---> pointer Quelle
1328        // char* memcpy_byte_dest ---> pointer Ziehl
1329        // long  memcpy_byte_anzb ---> Anzahl bytes die kopiert werden sollen.
1330       
1331        memcpy_byte_src = src;
1332        memcpy_byte_dest = dest;
1333        memcpy_byte_anzb = anzb;
1334       
1335#ifndef ARM     
1336        asm (   
1337                                "               li    $12, 4                                                            \n"
1338                                "               lw        $8, memcpy_byte_src           \n"
1339                                "               lw        $9, memcpy_byte_dest  \n"                             
1340                                "               lw              $10, memcpy_byte_anzb   \n"             
1341                                "word:                                                                                                  \n"
1342                                "               bltu    $10, $12, byte                          \n"
1343                                "               lw        $11, ($8)                                                     \n"
1344                                "               sw        $11, ($9)                                                     \n"
1345                                "               addi    $8, $8, 4                                                       \n"
1346                                "               addi    $9, $9, 4                                                       \n"
1347                                "               addi    $10, $10, -4                                    \n"
1348                                "               b                       word                                                                    \n"
1349                                "byte:                                                                                                  \n"
1350                                "               beqz    $10, end                                                        \n"
1351                                "               lb        $11, ($8)                                                     \n"
1352                                "               sb        $11, ($9)                                                     \n"
1353                                "               addi    $8, $8, 1                                                       \n"
1354                                "               addi    $9, $9, 1                                                       \n"
1355                                "               addi    $10, $10, -1                                    \n"             
1356                                "               b     byte                                                                      \n"
1357                                "end:                                                                                                           \n"
1358                                "               nop                                                                                                     \n"       
1359                        );
1360#endif
1361}
1362
1363
1364void memcpy_area(unsigned char* targetADDR, unsigned char* startADDR, long pxAbs, long hight, long widthAbs, long FBwidthAbs)
1365{
1366
1367#ifndef ARM
1368        asm(   
1369
1370                                "               lw    $t3, %[targetADDR]                                                                                                        \n"
1371                                "               lw    $t4, %[startADDR]                                                                                                 \n"
1372                                "               lw              $t5, %[pxAbs]                                                                                                                   \n"
1373                                "               lw    $t6, %[widthAbs]                                                                                                  \n"
1374                                "               lw    $t7, %[FBwidthAbs]                                                                                                \n"
1375                                "               lw    $t8, %[hight]                                                                                                                     \n"
1376
1377                                "               move  $t0, $t4      # Temp-startADDR                                                    \n" 
1378                                "               move  $t1, $t6      # Temp-widthAbs                                                             \n"
1379                                "               add   $t2, $t5, $t6                                                                                                                             \n"
1380                                "               sub   $t7, $t7, $t2 # Diff withAbs und FBwidthAbs       \n"
1381
1382                                "p3NewLine2:                                                                                                                                                                    \n"             
1383                                "               beqz  $t8, p3End                                                                                                                                        \n"
1384                                "p3NextWord:                                                                                                                                                                    \n"
1385                                "   beqz  $t1, p3NewLine1                                                                                                                       \n"
1386                                "               lw    $t9, ($t0)                                                                                                                                        \n"
1387                                "               sw    $t9, ($t3)                                                                                                                                        \n"
1388                                "               addi  $t0, 4                                                                                                                                                    \n"
1389                                "               addi  $t3, 4                                                                                                                                                    \n"
1390                                "               addi  $t1, -4                                                                                                                                                   \n"
1391                                "               b     p3NextWord                                                                                                                                        \n"
1392
1393               
1394                                "p3NewLine1:                                                                                                                                                                    \n"
1395                                "               move  $t0, $t4                                                                                                                                          \n"
1396                                "               move  $t1, $t6                                                                                                                                          \n"
1397                                "               add   $t3, $t3, $t7                                                                                                                             \n"
1398                                "               add   $t3, $t3, $t5                                                                                                                             \n"
1399                                "               addi  $t8, -1                                                                                                                                                   \n"
1400                                "               b     p3NewLine2                                                                                                                                        \n"
1401
1402                                "p3End:                                                                                                                                                                                         \n"
1403                                "               nop                                                                                                                                                                                             \n"     
1404                                ::[targetADDR] "m" (targetADDR), [startADDR] "m" (startADDR), [pxAbs] "m" (pxAbs), [widthAbs] "m" (widthAbs), [FBwidthAbs] "m" (FBwidthAbs), [hight] "m" (hight)
1405                                );
1406#endif
1407                               
1408        return;
1409}
1410
1411int setfbosddev(char* dev, int value)
1412{
1413        char* tmpstr = NULL;
1414        int ret = 0;
1415
1416        tmpstr = malloc(10);
1417        if(tmpstr == NULL)
1418        {
1419                err("no mem");
1420                return 1;
1421        }
1422       
1423        sprintf(tmpstr, "%x", value);
1424        debug(101, "set %s to %s", dev, tmpstr);
1425
1426        if(dev != NULL)
1427        {
1428                ret = writesys(dev, tmpstr, 1);
1429                return ret;
1430        }
1431
1432        return 0;
1433}
1434
1435char* getfbosddev(char* dev)
1436{
1437        char *value = NULL;
1438
1439        if(dev == NULL)
1440        {
1441                err("NULL detect");
1442                return NULL;
1443        }
1444
1445        value = readsys(dev, 1);
1446        if(value == NULL)
1447        {
1448                err("NULL detect");
1449                return NULL;
1450        }
1451
1452        debug(101, "get %s to %s", dev, value);
1453               
1454        return value;
1455}
1456
1457
1458void setfbosd()
1459{
1460        debug(101, "################## set osd offset ####################");
1461        debug(101, "status.leftoffset: %d", status.leftoffset);
1462        debug(101, "status.rightoffset: %d", status.rightoffset);
1463        debug(101, "status.topoffset: %d", status.topoffset);
1464        debug(101, "status.bottomoffset: %d", status.bottomoffset);
1465       
1466        char* fbleftdev = "/proc/stb/fb/dst_left";
1467        char* fbwidthdev = "/proc/stb/fb/dst_width";
1468        char* fbtopdev = "/proc/stb/fb/dst_top";
1469        char* fbheightdev = "/proc/stb/fb/dst_height";
1470       
1471        int fbleft = strtol(getfbosddev(fbleftdev) , NULL, 16);
1472        int fbwidth = strtol(getfbosddev(fbwidthdev) , NULL, 16);
1473        int fbtop = strtol(getfbosddev(fbtopdev) , NULL, 16);
1474        int fbheight = strtol(getfbosddev(fbheightdev) , NULL, 16);
1475        debug(101, "Setting OSD position: %d %d %d %d", fbleft ,fbwidth ,fbtop ,fbheight);
1476       
1477        fbleft = status.leftoffset;
1478        fbwidth = 720 - status.leftoffset - status.rightoffset;
1479        fbtop = status.topoffset;
1480        fbheight = 576 - status.topoffset - status.bottomoffset;
1481        debug(101, "Setting OSD position changed: %d %d %d %d", fbleft ,fbwidth ,fbtop ,fbheight);
1482        debug(10, "Setting OSD position changed: %d %d %d %d", fbleft ,fbwidth ,fbtop ,fbheight);
1483       
1484        setfbosddev(fbleftdev, fbleft);
1485        setfbosddev(fbwidthdev, fbwidth);
1486        setfbosddev(fbtopdev, fbtop);
1487        setfbosddev(fbheightdev, fbheight);
1488        debug(101, "######################################################");
1489}
1490
1491int setrtctimemips()
1492{
1493        char *rtctimedev = NULL, *tmpstr = NULL;
1494        int ret = 0;
1495//      int value = 0;
1496       
1497        time_t t = time(NULL);
1498        struct tm *local = localtime(&t);
1499        time_t rawlocal = mktime(local);
1500       
1501        t = time(NULL);
1502        struct tm *gmt = gmtime(&t);
1503        time_t rawgmt = mktime(gmt);
1504 
1505        int offset = difftime(rawlocal, rawgmt);
1506
1507        tmpstr = oitoa(offset);
1508        rtctimedev = getconfig("rtctime_offsetdev", NULL);
1509        if(rtctimedev != NULL)
1510                ret = writesys(rtctimedev, tmpstr, 0);
1511        else
1512                ret = writesys("/proc/stb/fp/rtc_offset", tmpstr, 0);
1513        free(tmpstr); tmpstr = NULL;
1514        rtctimedev = NULL;
1515       
1516        if(ret == 0)
1517        {
1518                tmpstr = oitoa(rawlocal);
1519                rtctimedev = getconfig("rtctimedev", NULL);
1520                if(rtctimedev != NULL)
1521                        ret = writesys(rtctimedev, tmpstr, 0);
1522                else
1523                        ret = writesys("/proc/stb/fp/rtc", tmpstr, 0);
1524                free(tmpstr); tmpstr = NULL;
1525                rtctimedev = NULL;
1526        }
1527        return ret;
1528}
1529
1530#endif
Note: See TracBrowser for help on using the repository browser.