95 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|         @brief Sample code.\n
 | |
| 
 | |
|         @file dummy.c
 | |
| 
 | |
|         @author Niven Cho
 | |
| 
 | |
|         @ingroup mhdal
 | |
| 
 | |
|         @note Nothing.
 | |
| 
 | |
|         Copyright Novatek Microelectronics Corp. 2018.  All rights reserved.
 | |
| */
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <kwrap/cmdsys.h>
 | |
| #include <sys/stat.h>
 | |
| #include <fcntl.h>
 | |
| #include <unistd.h>
 | |
| #include "libfdt.h"
 | |
| 
 | |
| int gen_rc_profile(const char *path_dst, const char *path_dtb)
 | |
| {
 | |
|         FILE *fin = fopen(path_dtb, "rb");
 | |
|         if (!fin) {
 | |
|                 fprintf(stderr, "unable to open %s.\n", path_dtb);
 | |
|                 return -1;
 | |
|         }
 | |
| 
 | |
|         struct stat st;
 | |
|         if(stat(path_dtb, &st) != 0) {
 | |
|                 fprintf(stderr, "unable to stat %s.\n", path_dtb);
 | |
|                 fclose(fin);
 | |
|                 return -1;
 | |
|         }
 | |
| 
 | |
|         void *fdt = (void *)malloc(st.st_size);
 | |
|         if (fdt == NULL) {
 | |
|                 fprintf(stderr, "memory is not enough.\n");
 | |
| 		fclose(fin);
 | |
|                 return -1;
 | |
|         }
 | |
| 
 | |
|         size_t fdt_size = fread(fdt, 1, st.st_size, fin);
 | |
|         if (fdt_size != st.st_size) {
 | |
|                 fprintf(stderr, "unable to read %s %d %d.\n", path_dtb, (int)fdt_size, (int)st.st_size);
 | |
|                 free(fdt);
 | |
|                 fclose(fin);
 | |
|                 return -1;
 | |
|         }
 | |
|         fclose(fin);
 | |
| 
 | |
| 	FILE *fout = fopen(path_dst, "wt");
 | |
|         if (!fout) {
 | |
|                 fprintf(stderr, "unable to create %s.\n", path_dst);
 | |
|                 free(fdt);
 | |
|                 return -1;
 | |
|         }
 | |
| 
 | |
| 	int len;
 | |
| 	int nodeoffset;
 | |
| 	nodeoffset = fdt_path_offset(fdt, "/nvt_info");
 | |
| 	if (nodeoffset != -FDT_ERR_NOTFOUND) {
 | |
| 		// other fields in nvt_info
 | |
| 		for (nodeoffset = fdt_first_property_offset(fdt, nodeoffset);
 | |
| 			(nodeoffset >= 0);
 | |
| 			(nodeoffset = fdt_next_property_offset(fdt, nodeoffset))) {
 | |
| 			const struct fdt_property *prop_reg;
 | |
| 			if (!(prop_reg = fdt_get_property_by_offset(fdt, nodeoffset, &len))) {
 | |
| 				break;
 | |
| 			}
 | |
| 			const char *name = fdt_string(fdt, fdt32_to_cpu(prop_reg->nameoff));
 | |
| 			const char *value = (const char *)prop_reg->data;
 | |
|                         fprintf(fout, "export %s='%s'\n", name, value);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	free(fdt);
 | |
|         fclose(fout);
 | |
|         return 0;
 | |
| }
 | |
| 
 | |
| MAINFUNC_ENTRY(dummy, argc, argv)
 | |
| {
 | |
| #if 0
 | |
|         return gen_rc_profile("/mnt/sd/profile", "/sys/firmware/fdt");
 | |
| #else
 | |
|         if (argc < 3) {
 | |
|                 fprintf(stderr, "usage: rc_profile output_profile input_dtb\n");
 | |
|                 return -1;
 | |
|         }
 | |
|         return gen_rc_profile(argv[1], argv[2]);
 | |
| #endif
 | |
| }
 | 
