SmartAudio/lichee/linux-4.9/scripts/dtc/script_parser/script_to_dts.c

89 lines
1.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "script_to_dts.h"
struct script *script;
int script_parse(const char *script_name)
{
int i;
int type;
int value[8];
char mainkey[32], subkey[32];
struct script_section *s = NULL;
script = script_new();
dictionary *d = iniparser_load(script_name);
if (d == NULL) {
return -1;
}
for (i = 0; i < d->size; i++) {
if (!d->key[i])
continue;
if (d->val[i]) {
type = iniparser_get_str2int(d->val[i], value);
if (type == -1) {
printf("[%s][%d]script change check subkey (%s) type failed.\n",
__func__, __LINE__, d->key[i]);
}
if (!(sscanf(d->key[i], "%[^:]:%[^\n]", mainkey, subkey) == 2)) {
return -1;
}
switch (type) {
case DATA_TYPE_SINGLE_WORD_HEX:
{
if (!script_single_hex_entry_new(s, subkey, value[0]))
return -1;
};
break;
case DATA_TYPE_SINGLE_WORD_DEC:
{
if (!script_single_dec_entry_new(s, subkey, value[0]))
return -1;
};
break;
case DATA_TYPE_STRING:
{
if (!script_string_entry_new(s, subkey, strlen(d->val[i]), (char *)(d->val[i])+1))
return -1;
};
break;
case DATA_TYPE_GPIO:
{
unsigned int port;
unsigned int port_num;
int v[4];
port = value[0];
port_num = value[1];
v[0] = value[2];
v[1] = value[3];
v[2] = value[4];
v[3] = value[5];
if (!script_gpio_entry_new(s, subkey, port, port_num, v))
return -1;
};
break;
case DATA_EMPTY:
if (!script_null_entry_new(s, subkey))
return -1;
break;
default:
printf("ERROR: Unknow section type\n");
return -1;
}
} else {
/* mainkey */
if ((s = script_section_new(script, d->key[i])) == NULL) {
return -1;
}
}
}
iniparser_freedict(d);
return 0;
}