|
|
  |
кодить под арм, хочу научится мало мальски |
|
|
|
May 20 2008, 08:43
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653

|
День добрый! Необходимо чуть-чуть разобраться с разработкой под АРМ. Что я имею: есть собранный сишный компилер. проги на нем пишу, так сказать высокоуровневые. но необходимо научится работать с ГПИО и переводить проц в спящий режим. тут как я понимаю С++ и тп не поможет. нашел на сайте АТМЕЛ доки и какие-то либы к AT91SAM9260 а именно softpack-1.4-at91sam9260-ek-web.zip там есть примеры, но не один пример не собирается: вываливается ошибка chaos@penguin:~/Work/Eddy/App/Hibernate> make /opt/lemonix/cdt/bin/arm-linux-gcc -Wall -mlong-calls -ffunction-sections -g -I../at91lib/boards/at91sam9260-ek -I../at91lib/peripherals -I../at91lib/components -I../at91lib -Dat91sam9260 -Dsdram -c -o obj/sdram_stdio.o ../at91lib/utility/stdio.c ../at91lib/utility/stdio.c:49: error: variable 'r' has initializer but incomplete type
возникло несколько вопросов: 1. поможет мне данная либа с этими 2мя задачами? если нет куда копать 2. как побороть ошибку?
Заранее благодарен
|
|
|
|
|
May 20 2008, 09:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(_chaos_ @ May 20 2008, 11:43)  но необходимо научится работать с ГПИО и переводить проц в спящий режим. тут как я понимаю С++ и тп не поможет. А как вы думаете, что делает эта библиотека? В конечном счете она пишет в регистры периферии. То же самое прекрасно делается на "С++ и т.п.". Весьма вероятно, что эта библиотека сама написана на "С++ и т.п.". Вам необходимо найти (или написать свой) заголовочный файл, в котором будут описаны регистры периферии (описаны как обычные volatile-переменные). Что-нибудь вроде ioAT91SAM9260.h. Скорее всего он есть в составе вашей библиотеки. А дальше читать описание процессора, разделы "ГПИО" и "спящий режим", там будет написано, за что отвечает каждый из регистров. Ну а дальше все сводится к присвоению данных соотвествующим переменным-регистрам.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 20 2008, 10:31
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653

|
Цитата(Сергей Борщ @ May 20 2008, 12:54)  Вам необходимо найти (или написать свой) заголовочный файл, в котором будут описаны регистры периферии (описаны как обычные volatile-переменные). Что-нибудь вроде ioAT91SAM9260.h. Скорее всего он есть в составе вашей библиотеки. чего-то я недопанимаю  а как будут связаные переменные и регистры?
|
|
|
|
|
May 20 2008, 11:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(_chaos_ @ May 20 2008, 13:31)  чего-то я недопанимаю  а как будут связаные переменные и регистры? А вы найдите этот файл и посмотрите. Вот, например, для AT91SAM7: Код typedef volatile unsigned int AT91_REG;// Hardware register definition #define AT91_CAST(a) (a) typedef struct _AT91S_CKGR { AT91_REG CKGR_MOR; // Main Oscillator Register AT91_REG CKGR_MCFR; // Main Clock Frequency Register AT91_REG Reserved0[1]; // AT91_REG CKGR_PLLR; // PLL Register } AT91S_CKGR, *AT91PS_CKGR; // -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- #define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable #define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass #define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time // -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- #define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency #define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready // -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- #define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected #define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 #define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed #define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter #define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range #define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet #define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet #define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet #define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet #define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier #define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks #define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output #define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 #define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4
#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address
// использование:
void Test() { AT91C_BASE_CKGR->CKGR_MOR = AT91C_CKGR_MOSCEN | AT91C_CKGR_DIV_0 | AT91C_CKGR_USBDIV_0; }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 20 2008, 11:38
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653

|
Цитата(Сергей Борщ @ May 20 2008, 14:32)  файл нашел. похоже на то что привели Вы Код #ifndef AT91SAM9260_H #define AT91SAM9260_H
#ifndef __ASSEMBLY__ typedef volatile unsigned int AT91_REG;// Hardware register definition #define AT91_CAST(a) (a) #else #define AT91_CAST(a) #endif
// ***************************************************************************** // SOFTWARE API DEFINITION FOR System Peripherals // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_SYS { AT91_REG SDRAMC_MR; // SDRAM Controller Mode Register AT91_REG SDRAMC_TR; // SDRAM Controller Refresh Timer Register AT91_REG SDRAMC_CR; // SDRAM Controller Configuration Register AT91_REG SDRAMC_HSR; // SDRAM Controller High Speed Register AT91_REG SDRAMC_LPR; // SDRAM Controller Low Power Register AT91_REG SDRAMC_IER; // SDRAM Controller Interrupt Enable Register AT91_REG SDRAMC_IDR; // SDRAM Controller Interrupt Disable Register AT91_REG SDRAMC_IMR; // SDRAM Controller Interrupt Mask Register AT91_REG SDRAMC_ISR; // SDRAM Controller Interrupt Mask Register AT91_REG SDRAMC_MDR; // SDRAM Memory Device Register AT91_REG Reserved0[118]; // AT91_REG SMC_SETUP0; // Setup Register for CS 0 AT91_REG SMC_PULSE0; // Pulse Register for CS 0 AT91_REG SMC_CYCLE0; // Cycle Register for CS 0 AT91_REG SMC_CTRL0; // Control Register for CS 0 AT91_REG SMC_SETUP1; // Setup Register for CS 1 AT91_REG SMC_PULSE1; // Pulse Register for CS 1 AT91_REG SMC_CYCLE1; // Cycle Register for CS 1 AT91_REG SMC_CTRL1; // Control Register for CS 1 AT91_REG SMC_SETUP2; // Setup Register for CS 2 AT91_REG SMC_PULSE2; // Pulse Register for CS 2 AT91_REG SMC_CYCLE2; // Cycle Register for CS 2 AT91_REG SMC_CTRL2; // Control Register for CS 2 AT91_REG SMC_SETUP3; // Setup Register for CS 3 AT91_REG SMC_PULSE3; // Pulse Register for CS 3 AT91_REG SMC_CYCLE3; // Cycle Register for CS 3 AT91_REG SMC_CTRL3; // Control Register for CS 3 AT91_REG SMC_SETUP4; // Setup Register for CS 4 AT91_REG SMC_PULSE4; // Pulse Register for CS 4 AT91_REG SMC_CYCLE4; // Cycle Register for CS 4 AT91_REG SMC_CTRL4; // Control Register for CS 4 AT91_REG SMC_SETUP5; // Setup Register for CS 5 AT91_REG SMC_PULSE5; // Pulse Register for CS 5 AT91_REG SMC_CYCLE5; // Cycle Register for CS 5 AT91_REG SMC_CTRL5; // Control Register for CS 5 AT91_REG SMC_SETUP6; // Setup Register for CS 6 AT91_REG SMC_PULSE6; // Pulse Register for CS 6 AT91_REG SMC_CYCLE6; // Cycle Register for CS 6 AT91_REG SMC_CTRL6; // Control Register for CS 6 AT91_REG SMC_SETUP7; // Setup Register for CS 7 ............. по поводу примера использования: разве в юзер моде этот код не вылетит(Segmentation fault)? все верно, вылетит  Код #include "AT91SAM9260.h" #include <stdio.h>
int main() { printf("PMC_SCSR=%X\n", AT91C_BASE_PMC); printf("PMC_SCSR=%X\n", AT91C_BASE_PMC->PMC_SCDR);//Тута будет БАБАХ!!!!! return 0; } как быть? в режиме ядра необходимо выполнять или можно как еще?
Сообщение отредактировал _chaos_ - May 20 2008, 11:37
|
|
|
|
|
May 20 2008, 12:23
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653

|
Цитата(Сергей Борщ @ May 20 2008, 15:03)  Вот тут я пас. Для таких больших не писал, а маленькие Segmentation fault не умеют как же быть
|
|
|
|
|
May 20 2008, 17:18
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(_chaos_ @ May 20 2008, 14:38)  по поводу примера использования: разве в юзер моде этот код не вылетит(Segmentation fault)? как быть? в режиме ядра необходимо выполнять или можно как еще? А у Вас ОС есть? Если есть - либо драйвер писать либо /dev/mem Ваш (не)друг.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
May 20 2008, 19:47
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Сергей Борщ @ May 20 2008, 16:03)  Вот тут я пас. Для таких больших не писал, а маленькие Segmentation fault не умеют Дык вроде ж из начального поста ясно: Код ................. /opt/lemonix/cdt/bin/arm-linux-gcc ............. что там линух, ну а для линуха или пишем свой драйвер или mm(memory map) или обращение к уже сушествуещему /dev/XXX вроде как другого не дано...
|
|
|
|
|
May 26 2008, 07:56
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653

|
Цитата(amw @ May 20 2008, 20:18)  либо /dev/mem нашел на сайте пример работы http://www.simtec.co.uk/appnotes/AN0014/опробовал пергружать системы запись в регистр RSTC - все ок. а вот что-то со спящим режимом не очень понятно, запись в регистр PMC_SCDR ничего не дает
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|