fix aio-grab.
[vuplus_openvuplus] / meta-openvuplus / recipes-vuplus / aio-grab / aio-grab / aio-grab_vuplus.patch
index 1459e22..b9f4039 100644 (file)
 diff --git a/main.c b/main.c
-index 190ff5f..08298e9 100644
+index ffff998..4bf7327 100644
 --- a/main.c
 +++ b/main.c
-@@ -101,8 +101,8 @@ static void combine(unsigned char *output,
-                   const unsigned char *video, const unsigned char *osd,
                  unsigned int xres, unsigned int yres);
+@@ -86,8 +86,8 @@ void (*resize)(unsigned char *source, unsigned char *dest, int xsource, int ysou
+ void combine(unsigned char *output, unsigned char *video, unsigned char *osd, int xres, int yres);
char* upcase(char* mixedstr);
  
 -enum {UNKNOWN,PALLAS,VULCAN,XILLEON,BRCM7401,BRCM7400,BRCM7405};
--static const char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405"};
-+enum {UNKNOWN,PALLAS,VULCAN,XILLEON,BRCM7401,BRCM7400,BRCM7405,BRCM7335,BRCM7325};
-+static const char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405","Brcm7335","Brcm7325"};
static int stb_type=UNKNOWN;
+-char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405"};
++enum {UNKNOWN,PALLAS,VULCAN,XILLEON,BRCM7401,BRCM7400,BRCM7405,BRCM7335,BRCM7325,BRCM7346,BRCM7425};
++char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405","Brcm7335","Brcm7325","Brcm7346","Brcm7425"};
+ int stb_type=UNKNOWN;
  
- static const char *file_getline(const char *filename)
-@@ -221,6 +221,22 @@ int main(int argc, char **argv) {
-                        !strcmp(line, "dm800se") ||
-                        !strcmp(line, "dm7020hd"))
-                       stb_type = BRCM7405;
+ // main program
+@@ -139,6 +139,53 @@ int main(int argc, char **argv) {
+                               stb_type=BRCM7405;
+               }
+               pclose(pipe);
 +
 +              // CPU Detection. idea from pl
-+              if (line != NULL)
-+                      free(line);
-+              line = file_getline("/proc/stb/info/chipset");
-+              if(line)
++              pipe=popen("cat /proc/stb/info/chipset","r");
++              if(pipe)
 +              {
-+                      if (!strcmp(line, "7335"))
-+                              stb_type = BRCM7335;
-+                      else if (!strcmp(line, "7325"))
-+                              stb_type = BRCM7325;
-+                      else if (!strcmp(line, "7405"))
-+                              stb_type = BRCM7405;
++                      while (fgets(buf,sizeof(buf),pipe))
++                      {
++                              if (strstr(upcase(buf),"7335"))
++                              {
++                                      stb_type=BRCM7335;
++                                      break;
++                              }
++                              else if (strstr(upcase(buf),"7325"))
++                              {
++                                      stb_type=BRCM7325;
++                                      break;
++                              }
++                              else if (strstr(upcase(buf),"7405"))
++                              {
++                                      stb_type=BRCM7405;
++                                      break;
++                              }
++                                else if (strstr(upcase(buf),"7356"))
++                                {
++                                        stb_type=BRCM7346;
++                                        break;
++                                }
++                                else if (strstr(upcase(buf),"7346"))
++                                {
++                                        stb_type=BRCM7346;
++                                        break;
++                                }
++
++                                else if (strstr(upcase(buf),"7424"))
++                                {
++                                        stb_type=BRCM7425;
++                                        break;
++                                }
++                                else if (strstr(upcase(buf),"7425"))
++                                {
++                                        stb_type=BRCM7425;
++                                        break;
++                                }
++
++                      }
 +              }
-+              free(line);
-+              
-       } else if (strstr(line, "xilleonfb")) {
-               stb_type = XILLEON;
-       } else if (strstr(line, "Pallas FB")) {
-@@ -564,7 +580,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
-               return false;
++              pclose(pipe);
        }
  
+       if (stb_type == UNKNOWN)
+@@ -491,15 +538,27 @@ void getvideo(unsigned char *video, int *xres, int *yres)
+       char buf[256];
+       FILE *pipe;
 -      if (stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405)
-+      if (stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405 || stb_type == BRCM7335 || stb_type == BRCM7325)
++      if (stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405 || stb_type == BRCM7335 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425)
        {
                // grab brcm7401 pic from decoder memory
-               unsigned char *memory = mmap(0, 100, PROT_READ, MAP_SHARED, mem_fd, 0x10100000);
-@@ -609,7 +625,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
-               assert(chroma);
+               
+-              if(!(memory = (unsigned char*)mmap(0, 100, PROT_READ, MAP_SHARED, mem_fd, 0x10100000)))
++              if(stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405 || stb_type == BRCM7335 || stb_type == BRCM7325)
+               {
+-                      printf("Mainmemory: <Memmapping failed>\n");
+-                      return;
++                      if(!(memory = (unsigned char*)mmap(0, 100, PROT_READ, MAP_SHARED, mem_fd, 0x10100000)))
++                      {
++                              printf("Mainmemory: <Memmapping failed>\n");
++                              return;
++                      }
++              }
++              else
++              {
++                      if(!(memory = (unsigned char*)mmap(0, 100, PROT_READ, MAP_SHARED, mem_fd, 0x10600000)))
++                      {
++                              printf("Mainmemory: <Memmapping failed>\n");
++                              return;
++                      }
+               }
++      
+               unsigned char data[100];
+@@ -509,17 +568,31 @@ void getvideo(unsigned char *video, int *xres, int *yres)
+               memcpy(data,memory,100); 
+               //vert_start=data[0x1B]<<8|data[0x1A];
+               //vert_end=data[0x19]<<8|data[0x18];
+-              stride=data[0x15]<<8|data[0x14];        
+-              ofs=(data[0x28]<<8|data[0x27])>>4;
+-              ofs2=(data[0x2c]<<8|data[0x2b])>>4;
+-              adr=(data[0x1f]<<24|data[0x1e]<<16|data[0x1d]<<8|data[0x1c])&0xFFFFFF00;
+-              adr2=(data[0x23]<<24|data[0x22]<<16|data[0x21]<<8|data[0x20])&0xFFFFFF00;
+-              offset=adr2-adr;
++              if(stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405 || stb_type == BRCM7335 || stb_type == BRCM7325)
++              {
++                      stride=data[0x15]<<8|data[0x14];        
++                      ofs=(data[0x28]<<8|data[0x27])>>4;
++                      ofs2=(data[0x2c]<<8|data[0x2b])>>4;
++                      adr=(data[0x1f]<<24|data[0x1e]<<16|data[0x1d]<<8|data[0x1c])&0xFFFFFF00;
++                      adr2=(data[0x23]<<24|data[0x22]<<16|data[0x21]<<8|data[0x20])&0xFFFFFF00;
++                      offset=adr2-adr;
++              }
++                else
++                {
++                        stride=data[0x15]<<8|data[0x14];
++                        ofs=(data[0x3c]<<8|data[0x3b])>>4;
++                        ofs2=(data[0x40]<<8|data[0x3f])>>4;
++                        adr=(data[0x1f]<<24|data[0x1e]<<16|data[0x1d]<<8|data[0x1c])&0xFFFFFF00;
++                        adr2=(data[0x37]<<24|data[0x36]<<16|data[0x35]<<8|data[0x34])&0xFFFFFF00;
++                        offset=adr2-adr;
++
++                }
++
+               
+               munmap(memory, 100);
+-              // printf("Stride: %d Res: %d\n",stride,res);
+-              // printf("Adr: %X Adr2: %X OFS: %d %d\n",adr,adr2,ofs,ofs2);
++              printf("Stride: %d Res: %d\n",stride,res);
++              printf("Adr: %X Adr2: %X OFS: %d %d\n",adr,adr2,ofs,ofs2);
+               pipe=popen("cat /proc/stb/vmpeg/0/yres","r");
+               while (fgets(buf,sizeof(buf),pipe))
+@@ -530,7 +603,7 @@ void getvideo(unsigned char *video, int *xres, int *yres)
+               chroma = (unsigned char *)malloc(stride*(ofs2+64));     
  
                // grabbing luma & chroma plane from the decoder memory
--              if (stb_type == BRCM7401 || stb_type == BRCM7405) {
-+              if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325) {
+-              if (stb_type == BRCM7401 || stb_type == BRCM7405)
++              if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425)
+               {
                        // on dm800/dm500hd we have direct access to the decoder memory
-                       memory = mmap(0, offset + stride*(ofs2+64), PROT_READ, MAP_SHARED, mem_fd, adr);
-                       if (memory == MAP_FAILED) {
-@@ -620,7 +636,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
-                       usleep(50000);  // we try to get a full picture, its not possible to get a sync from the decoder so we use a delay
-                                       // and hope we get a good timing. dont ask me why, but every DM800 i tested so far produced a good
-                                       // result with a 50ms delay
--              } else if (stb_type == BRCM7400) { 
-+              } else if (stb_type == BRCM7400 || stb_type == BRCM7335) {
+                       if(!(memory_tmp = (unsigned char*)mmap(0, offset + stride*(ofs2+64), PROT_READ, MAP_SHARED, mem_fd, adr)))
+@@ -543,7 +616,7 @@ void getvideo(unsigned char *video, int *xres, int *yres)
+                                                       // and hope we get a good timing. dont ask me why, but every DM800 i tested so far produced a good
+                                                       // result with a 50ms delay
+                       
+-              } else if (stb_type == BRCM7400)
++              } else if (stb_type == BRCM7400 || stb_type == BRCM7335)
+               {
                        // on dm8000 we have to use dma, so dont change anything here until you really know what you are doing !
                        
-                       unsigned int i = 0;
-@@ -640,6 +656,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+@@ -553,7 +626,7 @@ void getvideo(unsigned char *video, int *xres, int *yres)
+                               return;
+                       }
                        volatile unsigned long *mem_dma;
-                       mem_dma = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x10c02000);
-+                      mem_dma = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, (stb_type==BRCM7400)? 0x10c02000:0x10c01000);
-                       if (mem_dma == MAP_FAILED) {
-                               perror("mmap");
-                               return false;
-@@ -676,7 +693,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
-               unsigned int chr_luma_stride = 0x40;
-               unsigned int sw;
+-                      if(!(mem_dma = (volatile unsigned long*)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x10c02000)))
++                      if(!(mem_dma = (volatile unsigned long*)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, (stb_type==BRCM7400)? 0x10c02000:0x10c01000)))
+                       {
+                               printf("Mainmemory: <Memmapping failed>\n");
+                               return;
+@@ -595,7 +668,7 @@ void getvideo(unsigned char *video, int *xres, int *yres)
+               int chr_luma_stride = 0x40;
+               int sw=1;
  
 -              if (stb_type == BRCM7405)
-+              if (stb_type == BRCM7405 || stb_type == BRCM7325)
++              if (stb_type == BRCM7405 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425)
                        chr_luma_stride *= 2;
  
                xsub=chr_luma_stride;
-@@ -711,9 +728,9 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+@@ -630,9 +703,9 @@ void getvideo(unsigned char *video, int *xres, int *yres)
                        }
                }
  
 -              if (stb_type == BRCM7401 || stb_type == BRCM7405)
-+              if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325)
-                       munmap(memory, offset + stride * (ofs2 + 64));
--              else if (stb_type == BRCM7400) {
-+              else if (stb_type == BRCM7400 || stb_type == BRCM7335) {
-                       memory -= 0x1000;
-                       munmap(memory, DMA_BLOCKSIZE + 0x1000);
-               }
++              if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425)
+                       munmap(memory_tmp, offset + stride*(ofs2+64));
+-              else if (stb_type == BRCM7400)
++              else if (stb_type == BRCM7400 || stb_type == BRCM7335)
+                       munmap(memory_tmp, DMA_BLOCKSIZE + 0x1000);
+               for (t=0; t< stride*ofs;t+=4)