AOSP и U-Boot - sscanf () не записывает в переменные - PullRequest
0 голосов
/ 02 мая 2020

Я в тупике, и мне нужен кто-то, кто скажет мне, что мне не хватает.

Мне пришлось обновить загрузчик U-boot на моих устройствах, и, естественно, мне пришлось сделать все снова подходит И сейчас я пытаюсь получить доступ к переменным среды U-Boot из Linux / Android.

Короче говоря, я создал файл /etc/fw_env.config, который указывает на * 1006 U-Boot * раздел в Fla sh. Как описано здесь: https://elinux.org/U-boot_environment_variables_in_linux

Это не удалось, и поэтому я начал добавлять операторы печати в исходный код для отладки моего устройства. Я отследил ошибку до функции get_config(), которая, как можно себе представить, открывает /etc/fw_env.config и записывает значения в необходимые переменные.

Я сузил ее до sscanf() функция, которая возвращает 0, как в 0 переменных, прочитанных и / или записанных. Итак, в качестве проверки работоспособности я изолировал функцию и создал свою собственную маленькую программу отдельно от моего исходного кода (имена переменных и структуры я сохранил точно так же).

/* sscanf example */
#include <stdio.h>

struct envdev_s {
    const char *devname;            /* Device name */
    long long devoff;               /* Device offset */
    unsigned long env_size;         /* environment size */
    unsigned long erase_size;       /* device erase size */
    unsigned long env_sectors;      /* number of environment sectors */
    unsigned int mtd_type;          /* type of the MTD device */
};

static struct envdev_s envdevices[2] = {};

#define DEVNAME(i)    envdevices[(i)].devname
#define DEVOFFSET(i)  envdevices[(i)].devoff
#define ENVSIZE(i)    envdevices[(i)].env_size
#define DEVESIZE(i)   envdevices[(i)].erase_size
#define ENVSECTORS(i) envdevices[(i)].env_sectors
#define DEVTYPE(i)    envdevices[(i)].mtd_type

int main ()
{
  char dump [] = "/dev/mtd1 0xc0000 0x2000  0x2000\n";
  char *devname;
  int i = 0;
  int rc;

  printf("I was here in get_config : dump = %s\n", dump);
  printf("I was here in get_config : i = %d\n", i);

  rc = sscanf(dump, "%ms %lli %lx %lx %lx",
                &devname,
                &DEVOFFSET(i),
                &ENVSIZE(i),
                &DEVESIZE(i),
                &ENVSECTORS(i));

  printf("I was here in get_config : rc = %d\n", rc);

  return 0;
}

Также воссоздал здесь: http://cpp.sh/5ckms

Теперь, когда я запускаю это независимо, оно работает так, как я ожидаю, в частности, выводя:

I was here in get_config : rc = 4

4 успешно, как char dump [] = "/dev/mtd1 0xc0000 0x2000 0x2000\n"; Но когда Я компилирую это и запускаю на моем устройстве, оно возвращает:

I was here in get_config : rc = 0

Компьютер говорит НЕТ! И никаких других сообщений об ошибках, чтобы работать с ними.

Я, очевидно, здесь не хватает фундаментального понимания. Либо какие-то разрешения, либо какие-то переменные установки где-то, но я не знаю, с чего начать. Может ли кто-нибудь указать мне правильное направление?

...