реклама на сайте
подробности

 
 
> Компиляция ПО под embedded. Непонятно как поступить., Как компилироваться - если используются функции ядра
Atridies
сообщение Jul 31 2015, 06:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Под плату SBC8600 (AM3359, Angstrom Linux) делаю программу. Есть Toolchain, и есть tools: для сборки ядра, u-boot и пр. под эту плату.

Пока используются стандартные функции Си - то все нормально: ПО компилится Toolchain-ом, нормально запускается и работает.
Но сейчас понадобился прямой доступ к регистрам микроконтроллера. Хочу сделать это так:
Код
base = ioremap(ADDR, SIZE);
__raw_writel(base+0x08F0, DATA);
x = __raw_readl(base+0x08F0);


Но этот код не хочет компилироваться.

Эти функции - принадлежат ядру и находятся в файлах: /arch/arm/include/asm/io.h. В самой Toolchain - нету такого файла и нету таких функций. Оно наверное и понятно - Toolchain вряд ли поддерживает функции ядра.
Подключил к своему проекту h-файл из tools для сборки ядра - все равно не компилится: у меня ведь проект ядра не компилируется вместе с программой.

Что делать - не знаю. Как вообще компилироваться - если используются функции ядра ?


P.S. Пробовал сделать это через /dev/mem и mmap - все получается, но работает только на чтение. Записать не получается.

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Atridies
сообщение Jul 31 2015, 15:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Вот попытка записать данные напрямую в память - через /dev/mem.


Код
    int mfd;
    void * base;
    int regData;
     char str[100];

    mfd = open("/dev/mem", O_RDWR);

    if( mfd < 0 )
      {
        printf("Cannot open /dev/mem.\n");
        return 0;
    }

    printf("/dev/mem opened.\n");

    base = mmap(0, 0x00001000, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, 0x44E10000);

    if (base == MAP_FAILED)
    {
        printf("Memory mapping error.\n");
        return 0;    //exit(EXIT_FAILURE);
    }

    printf("Memory block mapped at address %p.\n", base);

    regData = *((unsigned int*)(base + 0x0));
    sprintf(str, "Revision = 0x%X", regData);
    puts(str);

    regData = *((unsigned int*)(base + 0x600));
    sprintf(str, "Device ID = 0x%X", regData);
    puts(str);

    regData = *((unsigned int*)(base + 0x604));
    sprintf(str, "Dev. feature = 0x%X", regData);
    puts(str);

    regData = *((unsigned int*)(base + 0x8F0));
    sprintf(str, "Pin MMC0_DAT3 = 0x%X", regData);
    puts(str);

    *((unsigned int*)(base + 0x8F0)) = 0x34;
    sprintf(str, "Set pin MMC0_DAT3 = uart1_dcdn");
    puts(str);

    regData = *((unsigned int*)(base + 0x8F0));
    sprintf(str, "Pin MMC0_DAT3 = 0x%X", regData);
    puts(str);


    munmap(0, 0x00001000);

    return 0;


Проц: AM3359. В доке на него - указано, что запись в эти регистры может быть только в "privileged mode". Это от рута - или что-то другое ?
Go to the top of the page
 
+Quote Post
Jury093
сообщение Jul 31 2015, 18:05
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Atridies @ Jul 31 2015, 18:44) *
Вот попытка записать данные напрямую в память - через /dev/mem.
Проц: AM3359. В доке на него - указано, что запись в эти регистры может быть только в "privileged mode". Это от рута - или что-то другое ?

если бы днем выложили сорц, то прямо на ам3359 и посмотрел бы что не так..
да, все действия от рута, иначе любой юзер завалит систему одним движением..
вот куски из рабочего кода (запускал на nuc950), с коррекцией адресов пойдет на другой АРМ-архитектуре

Код
#define XZ_BA    0xB0000000
#define MAP_BASE1 (XZ_BA)

#define MAP_SIZE 4096Ul
#define MAP_MASK (MAP_SIZE - 1)

    int fd;
    void *mapped_base1;

    if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
    {
        printf("Cannot open /dev/mem.\n");
                exit(EXIT_FAILURE);
                    }
    printf("/dev/mem opened.\n");
        mapped_base1 = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MAP_BASE1 & ~MAP_MASK);

        if (mapped_base1 == (void *) -1)
        {
                printf("Memory mapping error.\n");
                        exit(EXIT_FAILURE);
                            }
    printf("Check register MFSEL\n");
    mapped_base1+=(MAP_BASE1 & MAP_MASK);
    printf("Target address mapped 0x%08x-->0x%08x\n",(int) MAP_BASE1,(int)mapped_base1);
    data = *(int*)(mapped_base1+0x00);
    printf("PDID     =%08X\n",data);
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 01:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.013 секунд с 7
ELECTRONIX ©2004-2016