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