1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <string.h>
5 #include <rtthread.h>
6 #include <log.h>
7 #include <hal_mem.h>
8 #include <video/sunxi_display2.h>
9 
10 
11 struct info_mm {
12     void *info_base;    /* Virtual address */
13     unsigned long mem_start;    /* Start of frame buffer mem */
14     /* (physical address) */
15     u32 mem_len;        /* Length of frame buffer mem */
16 };
17 
18 struct test_mem_cfg
19 {
20     int screen_id;
21     int layer_id;
22     int mem_id;
23     struct disp_layer_config layer_cfg;
24     int addr_map;
25     int width,height;//screen size
26     int dispfh;//device node handle
27     int fh;//picture resource file handle
28     void* mem;
29     int buffer_num;//is double buffer
30     int clear;//is clear layer
31     char filename[32];
32 };
33 
34 static struct info_mm g_disp_mm[10];
35 static int g_disp_mem_id = -1;
36 
37 #define DISP_TEST_BYTE_ALIGN(x) (((x + (4*1024-1)) >> 12) << 12)
disp_malloc(u32 num_bytes,void * phys_addr)38 static void *disp_malloc(u32 num_bytes, void *phys_addr)
39 {
40     u32 actual_bytes;
41     void *address = NULL;
42 
43     if (num_bytes != 0) {
44         actual_bytes = DISP_TEST_BYTE_ALIGN(num_bytes);
45 
46         address = hal_malloc(actual_bytes);
47         *(uint32_t *)phys_addr = __va_to_pa((unsigned long)address);
48         if (address) {
49         __wrn
50                 ("hal_malloc ok, phy addr=0x%p, vir addr=%p size=0x%x\n",
51                  (void *)(*(unsigned long *)phys_addr), address, num_bytes);
52             return address;
53         }
54 
55         printf("dma_alloc_coherent fail, size=0x%x\n", num_bytes);
56         return NULL;
57     }
58 
59     printf("%s size is zero\n", __func__);
60 
61     return NULL;
62 }
63 
disp_free(void * virt_addr,void * phys_addr,u32 num_bytes)64 static void disp_free(void *virt_addr, void *phys_addr, u32 num_bytes)
65 {
66     u32 actual_bytes;
67 
68     actual_bytes = DISP_TEST_BYTE_ALIGN(num_bytes);
69     if (phys_addr && virt_addr)
70         hal_free(virt_addr);
71 }
72 
disp_mem_release(int sel)73 static int disp_mem_release(int sel)
74 {
75     if (g_disp_mm[sel].info_base == NULL)
76         return -1;
77 
78     __inf("disp_mem_release, mem_id=%d, phy_addr=0x%p\n", sel,
79           (void *)g_disp_mm[sel].mem_start);
80     disp_free((void *)g_disp_mm[sel].info_base,
81           (void *)g_disp_mm[sel].mem_start, g_disp_mm[sel].mem_len);
82     memset(&g_disp_mm[sel], 0, sizeof(struct info_mm));
83     g_disp_mem_id = -1;
84     return 0;
85 }
86 
disp_mem_request(int sel,u32 size)87 static int disp_mem_request(int sel, u32 size)
88 {
89 
90     uintptr_t phy_addr;
91 
92     if ((sel >= 10) ||
93         (g_disp_mm[sel].info_base != NULL)) {
94         printf("invalid param\n");
95         return -1;
96     }
97 
98     g_disp_mm[sel].info_base = disp_malloc(size, (void *)&phy_addr);
99     if (g_disp_mm[sel].info_base) {
100         g_disp_mm[sel].mem_start = phy_addr;
101         g_disp_mm[sel].mem_len = size;
102         memset(g_disp_mm[sel].info_base, 0, size);
103         printf("pa=0x%p va=0x%p size:0x%x\n",
104               (void *)g_disp_mm[sel].mem_start,
105               g_disp_mm[sel].info_base, size);
106         g_disp_mem_id = sel;
107 
108         return 0;
109     }
110 
111     printf("disp_malloc fail!\n");
112     return -1;
113 }
114 
115 
disp_mem_getadr(u32 memid)116 u32 disp_mem_getadr(u32 memid)
117 {
118     if (memid < 10)
119         return g_disp_mm[memid].mem_start;
120     return 0;
121 }
122 
disp_mem(u32 mem_id,u32 width,u32 height,u32 clear_flag,char * filename)123 int disp_mem(u32 mem_id, u32 width, u32 height, u32 clear_flag, char *filename)
124 {
125     unsigned long arg[6];
126     int phy_adr, i, n, fb_width, fb_height;
127     int ret = -1;
128     FILE *fh = NULL;
129     void *mem = NULL;
130     unsigned long count = width*height;
131     char *tmp;
132     if(clear_flag) {
133         /* release memory && clear layer */
134         disp_mem_release(mem_id);
135         return 0;
136     }
137 
138     //for_test  we use r g b to set color buffer
139     if(filename[0] != 'r' && filename[0] != 'g' && filename[0] != 'b') {
140         if(filename != NULL)
141             fh = fopen(filename, "r");
142         if(!fh) {
143             printf("open file %s fail. \n", filename);
144             goto OUT;
145         }
146     }
147 
148     fb_width = width;
149     fb_height = height;
150 
151     ret = disp_mem_request(mem_id, fb_width*fb_height*4);
152     if(ret) {
153         printf("DISP_MEM_REQUEST 0\n");
154         goto FILE_CLOSE;
155     }
156 
157     phy_adr = g_disp_mm[mem_id].mem_start;
158     mem = g_disp_mm[mem_id].info_base;
159     tmp = mem;
160     if(fh != NULL) {
161         memset((void*)mem, 0x0, fb_width*fb_height*4);
162         fread((void *)mem, fb_width * fb_height * 4, 1, fh);
163     } else {
164         while(count--) {
165             //for(i = 0; i < 4; i++) {
166                 #if 0
167                 *(tmp) = 0xff;//A
168                 *(tmp + 1) = filename[0]=='r'?0xff:0;//R
169                 *(tmp + 2) = filename[0]=='g'?0xff:0;//G
170                 *(tmp + 3) = filename[0]=='b'?0xff:0;//B
171                 #else
172                 *(tmp + 3) = 0xff;//A
173                 *(tmp + 2) = filename[0]=='r'?0xff:0;//R
174                 *(tmp + 1) = filename[0]=='g'?0xff:0;//G
175                 *(tmp + 0) = filename[0]=='b'?0xff:0;//B
176                 #endif
177             //}
178                 tmp+=4;
179         }
180     }
181 
182 FILE_CLOSE:
183     if(fh!=NULL)
184         fclose(fh);
185 OUT:
186     return ret;
187 }
188 
disp_mem_clear(u32 mem_id)189 int disp_mem_clear(u32 mem_id)
190 {
191     return disp_mem(mem_id, 0, 0, 1, NULL);
192 }
193 
194 
parse_cmdline_and_alloc(int argc,char ** argv)195 int parse_cmdline_and_alloc(int argc, char **argv)
196 {
197     int err = 0;
198     int i = 0;
199     struct test_mem_cfg mem_cfg;
200     struct test_mem_cfg *p = &mem_cfg;
201     while(i<argc) {
202         printf("%s ",argv[i]);
203         i++;
204     }
205     memset(p, 0, sizeof(struct test_mem_cfg));
206     i = 0;
207     while(i < argc) {
208         if ( ! strcmp(argv[i], "-mem_id")) {
209             if (argc > i+1) {
210                 i+=1;
211                 p->mem_id = atoi(argv[i]);
212             }
213         }
214 
215         if ( ! strcmp(argv[i], "-clr")) {
216             if (argc > i+1) {
217                 i+=1;
218                 p->clear = atoi(argv[i]);
219             }
220         }
221 
222         if ( ! strcmp(argv[i], "-file")) {
223             if (argc > i+1) {
224                 i++;
225                 p->filename[0] = '\0';
226                 sprintf(p->filename,"%s",argv[i]);
227                 printf("filename=%s\n", argv[i]);
228             }   else {
229                 printf("no file described!!\n");
230                 err ++;
231             }
232         }
233 
234         if ( ! strcmp(argv[i], "-size")) {
235             if (argc > i+2) {
236                 i++;
237                 p->layer_cfg.info.fb.size[0].width = atoi(argv[i]);
238                 i++;
239                 p->layer_cfg.info.fb.size[0].height = atoi(argv[i]);
240             }   else {
241                 printf("-size para err!\n\n");
242                 err ++;
243             }
244         }
245 
246         if ( ! strcmp(argv[i], "-buffer_num")) {
247             if (argc > i+1) {
248                 i++;
249                 p->buffer_num = atoi(argv[i]);
250                 p->buffer_num = (p->buffer_num == 0)? 1:p->buffer_num;
251             }
252         }
253 
254         i++;
255     }
256 
257     if(err > 0) {
258         printf("example : ./disp_mem -mem_id 0 -size 1280 800 -double 0 -file ./pic/ui_1280x800_double_151.bin\n");
259         return -1;
260     } else {
261         if (p->clear)
262             return disp_mem_clear(p->mem_id);
263         return disp_mem(p->mem_id, p->layer_cfg.info.fb.size[0].width, p->layer_cfg.info.fb.size[0].height, 0, p->filename);
264     }
265 }
266 
267 FINSH_FUNCTION_EXPORT_ALIAS(parse_cmdline_and_alloc, disp_mem, disp mem);
268 
269