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
 | 
						|
}
 |