📄 mkparamblock.c
字号:
/* just some basic, very unfancy code for now */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#define USE_BLOB_TOGETHER_WITH_LIBC
#include <blob/param_block.h>
#include <blob/serial.h>
struct config_keyword {
char keyword[40];
int (*handler)(char *line, FILE *fp);
};
int convert_baud(char *arg)
{
serial_baud_t retval;
if(strcmp(arg, "1200") == 0) {
retval = baud_1200;
} else if(strcmp(arg, "1k2") == 0) {
retval = baud_1200;
} else if(strcmp(arg, "9600") == 0) {
retval = baud_9600;
} else if(strcmp(arg, "9k6") == 0) {
retval = baud_9600;
} else if(strcmp(arg, "19200") == 0) {
retval = baud_19200;
} else if(strcmp(arg, "19k2") == 0) {
retval = baud_19200;
} else if(strcmp(arg, "38400") == 0) {
retval = baud_38400;
} else if(strcmp(arg, "38k4") == 0) {
retval = baud_38400;
} else if(strcmp(arg, "57600") == 0) {
retval = baud_57600;
} else if(strcmp(arg, "57k6") == 0) {
retval = baud_57600;
} else if(strcmp(arg, "115200") == 0) {
retval = baud_115200;
} else if(strcmp(arg, "115k2") == 0) {
retval = baud_115200;
} else if(strcmp(arg, "230400") == 0) {
retval = baud_230400;
} else if(strcmp(arg, "230k4") == 0) {
retval = baud_230400;
} else return -1;
return (int) retval;
}
int read_yn(char *line)
{
char *arg;
if (!(arg = strtok(line, " \t"))) return -1;
if (!strcasecmp("yes", arg) || !strcmp("1", arg) || !strcasecmp("true", arg))
return 1;
else if (!strcasecmp("no", arg) || !strcmp("0", arg) || !strcasecmp("false", arg))
return 0;
return -1;
}
int tack_ramdisk(char *line, FILE *fp)
{
struct ptag tag;
tag.hdr.ptag = PTAG_RAMDISK;
tag.hdr.size = ptag_size(ptag_ramdisk);
tag.hdr.conf_mask = 0;
tag.hdr.conf = 0;
if ((tag.u.ramdisk.flags = read_yn(line)) == -1) return -1;
fwrite(&tag, ptag_size(ptag_ramdisk), 4, fp);
return 0;
}
int tack_bootdelay(char *line, FILE *fp)
{
struct ptag tag;
tag.hdr.ptag = PTAG_BOOTDELAY;
tag.hdr.size = ptag_size(ptag_bootdelay);
tag.hdr.conf_mask = 0;
tag.hdr.conf = 0;
if ((tag.u.bootdelay.delay = strtoul(line, 0, 0)) <= 0) return -1;
fwrite(&tag, ptag_size(ptag_bootdelay), 4, fp);
return 0;
}
int tack_cmdline(char *line, FILE *fp)
{
struct ptag tag;
int zero = 0;
tag.hdr.ptag = PTAG_CMDLINE;
tag.hdr.size = (sizeof(tag.hdr) + strlen(line) + 1 + 4) >> 2;
tag.hdr.conf_mask = 0;
tag.hdr.conf = 0;
fwrite(&tag, sizeof(tag.hdr), 1, fp);
fwrite(line, strlen(line) + 1, 1, fp);
fwrite(&zero, 1, (4 - (strlen(line) + 1)) % 4, fp);
return 0;
}
int tack_baud(char *line, FILE *fp)
{
struct ptag tag;
char *arg;
u32 terminal, download;
fpos_t bookmark;
tag.hdr.ptag = PTAG_BAUD;
tag.hdr.size = ptag_size(ptag_baud);
tag.hdr.conf_mask = 0;
tag.hdr.conf = 0;
if (!(arg = strtok(line, "\t =,"))) return -1;
if ((terminal = convert_baud(arg)) < 0) return -1;
if (!(arg = strtok(NULL, "\t ,"))) return -1;
if ((download = convert_baud(arg)) < 0) return -1;
tag.u.baud.download = download;
fgetpos(fp, &bookmark);
fseek(fp, (u32) &(tag.u.core.terminal) - (u32) &tag, SEEK_SET);
fwrite(&terminal, 4, 1, fp);
fsetpos(fp, &bookmark);
fwrite(&tag, ptag_size(ptag_baud), 4, fp);
return 0;
}
void tack_core(FILE *fp)
{
struct ptag tag;
tag.hdr.ptag = PTAG_CORE;
tag.hdr.size = ptag_size(ptag_core);
tag.hdr.conf_mask = 0;
tag.hdr.conf = 0;
tag.u.core.terminal = baud_9600;
fwrite(&tag, ptag_size(ptag_core), 4, fp);
}
void tack_none(FILE *fp)
{
struct ptag tag;
tag.hdr.ptag = PTAG_NONE;
tag.hdr.size = 0;
tag.hdr.conf_mask = 0;
tag.hdr.conf = 0;
fwrite(&tag, sizeof(tag.hdr), 1, fp);
}
static struct config_keyword keywords[] = {
/* keyword handler */
{"ramdisk", tack_ramdisk},
{"bootdelay", tack_bootdelay},
{"cmdline", tack_cmdline},
{"baud", tack_baud},
};
int main(int argc, char *argv[])
{
FILE *in, *out;
char buffer[256], *token, *line;
int i, line_num = 0;
if (argc < 2) {
printf("Usage: mkparamblock <configfile> <outfile>\n\n");
return 0;
}
if (!(in = fopen(argv[1], "r"))) {
perror("could not open config file");
return 0;
}
if (!(out = fopen(argv[2], "w"))) {
perror("could not open output file");
return 0;
}
tack_core(out);
while (fgets(buffer, 256, in)) {
line_num++;
/* clear trailing newline */
if (strchr(buffer, '\n')) *(strchr(buffer, '\n')) = '\0';
/* clear trailing comments */
if (strchr(buffer, '#')) *(strchr(buffer, '#')) = '\0';
/* find token */
token = buffer + strspn(buffer, " \t");
if (*token == '\0') continue;
/* find line */
line = token + strcspn(token, " \t=");
if (*line == '\0') continue;
*line = '\0';
line++;
line = line + strspn(line, " \t=");
if (*line == '\0') continue;
for (i = 0; strlen(keywords[i].keyword); i++)
if (!strcasecmp(token, keywords[i].keyword))
if (keywords[i].handler(line, out) < 0)
printf("Error %s args on line %d\n", token, line_num);
}
tack_none(out);
fclose(in);
fclose(out);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -