|
|
  |
NIOS для начинающих |
|
|
|
Apr 20 2011, 02:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Stewart Little @ Apr 19 2011, 17:12)  Вы сперва разберитесь, как вообще Flash работает. Чтение из флэши возможно и побайтное, и пословное. А вот стирание и запись - посекторные. См. предыдущий ответ ув. vadimuzzz Ну это от флеша к флешу. Есть флешки с побайтной записью. Ну и "считали блок->изменили часть данных->записали блок" это какой-то низкоуровневый алгоритм. Я и хочу с этим разобраться. В доках от альтеры написанно, что alt_write_flash() сотрет весь блок. Нужно заботится о том, чтоб не потерять данные. Также альтера предлагает alt_write_flash_block(), якобы в этой функции не надо об этом заботится. Да и вообще, коль есть апи, можно было и более высокоуровневую функцию сделать, типа write(адрессФлэш, указательИсточника, длинна). Причем если данные 1 байт, или данные перекрывают 3 блока (например 1/3 блока 8кб, 1 блок 8 кб и 100 байт из блока в 64 кб), то эта write должна сама сделать все низкоуровневые операции типа "считали блок->изменили часть данных->записали блок". Удевительно что в hal нет такой функции. придёться самому писать ((. Потом, тут есть регион и есть блок. Что такое регион я так и не понял. Что такое блок - понятно. Вся флеш разбита на блоки (по пдф), причем размер блоков разный. А вот что такое регион - ??? смотрю Alt_flash_types.h, структура Код typedef struct flash_region { int offset; int region_size; int number_of_blocks; int block_size; }flash_region; int region_size - размер региона. Что такое регион? Пока не понятно как работать с alt_flash_cfi_write? Есть у когонибудь демо проект с флешкой cfi? Поделитесь, заранее благодарен.
|
|
|
|
|
Apr 20 2011, 03:30
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(juvf @ Apr 20 2011, 09:28)  Ну и "считали блок->изменили часть данных->записали блок" это какой-то низкоуровневый алгоритм. для флешек с блочным стиранием это обычное дело. 3-4 вызова функций HAL, что тут низкоуровневого? вот дергать alt_flash_cfi_write - это и есть низкоуровневый доступ. а так можно и с SPI-ными флешками работать Цитата Потом, тут есть регион и есть блок. Что такое регион я так и не понял. Что такое блок - понятно. Вся флеш разбита на блоки (по пдф), причем размер блоков разный. А вот что такое регион - ??? смотрите даташит на свою флешку, там все расписано. например, у меня интеловская p30. имеет 2 региона с разными размерами блоков в первом 32кбайтные, во втором (основном) - 128 кбайтные. пример кода: CODE #include <stdio.h> #include "alt_types.h" #include "system.h" #include <io.h> #include <sys/alt_flash.h> #include <unistd.h> int main() { flash_region* regions; alt_flash_fd* fd; int number_of_regions; int ret_code; int i; printf("Hello from Nios II!\n"); fd = alt_flash_open_dev(CFI_FLASH_0_NAME); if (fd) { ret_code = alt_get_flash_info(fd, ®ions, &number_of_regions); for (i=0;i<number_of_regions;i++) { printf("Offset: %d\r\n", regions[i].offset); printf("Region Size: %d\r\n", regions[i].region_size); printf("Number of Blocks: %d\r\n", regions[i].number_of_blocks); printf("Block Size: %d\r\n\r\n", regions[i].block_size); } } }
выхлоп: Цитата Hello from Nios II! Offset: 0 Region Size: 131072 Number of Blocks: 4 Block Size: 32768
Offset: 131072 Region Size: 16646144 Number of Blocks: 127 Block Size: 131072 ну, и пример 6-11 посмотрите, как запись организована. имейте в виду, что там не производится проверка адресов на предмет перекрытия соседних блоков. эту проверку вы должны делать сами.
|
|
|
|
|
Apr 20 2011, 04:41
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(vadimuzzz @ Apr 20 2011, 09:30)  3-4 вызова функций HAL, что тут низкоуровневого? да уш не 3-4. А отслежывать перекрытие блоков..... Вызовов может и 3-4, но + к этому целый алгоритм мутить по отслежованию перекрытий. Цитата например, у меня интеловская p30. имеет 2 региона с разными размерами блоков в первом 32кбайтные, во втором (основном) - 128 кбайтные. спасибо, все стало понятно. пока у меня новая проблема: alt_flash_open_dev(CFI_FLASH_0_NAME) возвращает 0. Если не правильно распинать флешку, неправильно подключить, или если её физически нет, но в ниосе есть контроллер cfi - то что вернёт alt_flash_open_dev? ноль? ps Есть у алтеры дока "HAL API Reference". В ней говорится о функциях open(), read(), write(), close(). В частности Цитата The open() function opens a file or device and returns a file descriptor (a small, nonnegative integer for use in read, write, etc.) эта open(),,,,,,,, она работает (должна работать) с cfi flash?
|
|
|
|
|
Apr 20 2011, 06:01
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(juvf @ Apr 20 2011, 11:41)  да уш не 3-4. А отслежывать перекрытие блоков..... Вызовов может и 3-4, но + к этому целый алгоритм мутить по отслежованию перекрытий. драйвер делает ровно то, что позволяет флешка. может, вы захотите еще и файловую систему поверх водрузить - этим тот же драйвер должен заниматься? что вы хотите хранить на флешке, какая задача? Цитата пока у меня новая проблема: alt_flash_open_dev(CFI_FLASH_0_NAME) возвращает 0. а она у вас CFI_FLASH_0_NAME называется? в system.h посмотрите. Цитата Если не правильно распинать флешку, неправильно подключить, или если её физически нет, но в ниосе есть контроллер cfi - то что вернёт alt_flash_open_dev? ноль? нет. диагностировать подключение удобно при помощи nios2-flash-programmer. пускаете его с ключом --debug и смотрите, что он там пишет. Цитата(juvf @ Apr 20 2011, 11:41)  эта open(),,,,,,,, она работает (должна работать) с cfi flash? не должна
|
|
|
|
|
Apr 20 2011, 08:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(vadimuzzz @ Apr 20 2011, 12:01)  а она у вас CFI_FLASH_0_NAME называется? в system.h посмотрите. У меня CFI_FLASH_NAME, соответственно вызов делаю с именем CFI_FLASH_NAME. пробовал "/dev/cfi_flash" (из тогоже систем.аш) - тозе возвращает 0 Цитата нет. диагностировать подключение удобно при помощи nios2-flash-programmer. пускаете его с ключом --debug и смотрите, что он там пишет. выхлоп nios2-flash-programmer на картинке. Это нормальная работа флешки?
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 20 2011, 08:10
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(juvf @ Apr 20 2011, 15:03)  выхлоп nios2-flash-programmer на картинке. Это нормальная работа флешки? нет, похоже проблема с подключением. вот как примерно должно выглядеть: CODE Resetting and pausing target processor: OK Found CFI table in 16 bit mode Raw CFI query table read from device: 0: 89 00 1B 88 01 00 01 00 89 00 CF BF 01 00 01 00 ................ 10: 89 00 1B 88 01 00 01 00 89 00 CF BF 01 00 01 00 ................ 20: 51 00 52 00 59 00 01 00 00 00 0A 00 01 00 00 00 Q.R.Y........... 30: 00 00 00 00 00 00 17 00 20 00 85 00 95 00 08 00 ........ ....... 40: 09 00 0A 00 00 00 01 00 01 00 02 00 00 00 18 00 ................ CFI query table read from device: 10: 51 52 59 01 00 0A 01 00 00 00 00 17 20 85 95 08 QRY......... ... 20: 09 0A 00 01 01 02 00 18 01 00 06 00 02 03 00 80 ................ 30: 00 7E 00 00 02 00 00 00 00 FF FF FF FF FF FF FF .~.............. 40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ 50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ 60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ 70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ CFI extended table read from device: 0: 50 52 49 31 34 E6 01 00 00 01 03 00 18 90 02 80 PRI14........... 10: 00 03 03 89 00 00 00 00 00 00 10 00 04 03 04 01 ................ Read autoselect code 0089-881B (in 16 bit mode) No CFI override data for [FLASH-0089-881B] Target timeout loop runs 1497780 times/s Timeout set to 767 loops Device size is 16MByte Erase regions are: offset 0: 4 x 32K offset 20000: 127 x 128K Device supports Intel style programming algorithm Multi-byte programming with 64 byte buffer Sector erase timeout is 4s Word program timeout is 512us Buffer program timeout is 1ms Leaving target processor paused
а какая у вас борда?
|
|
|
|
|
Apr 26 2011, 07:12
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
Здравствуете! Начинаю работать с Ниос! Создал свой компонент, прицепил к ниосу, все нормально! Далее начинаю писать по адресу (через указатель) - тоже все работает! А вот чтение не получается! Может подскажете как надо!? прилагаю код компонента: Код library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all;
entity PC104 is port ( ats_s0_address : in std_logic_vector(15 downto 0):=(others => 'Z'); ats_s0_read_n : in std_logic := '1'; ats_s0_data : inout std_logic_vector(15 downto 0) := (others => 'Z'); ats_s0_chipselect_n : in std_logic := '1'; ats_s0_write_n : in std_logic := '1'; clk : in std_logic := '1'; reset : in std_logic := '1'; cos_RD_n : out std_logic := '1'; cos_WR_n : out std_logic := '1'; cos_CS_n : out std_logic := '1'; -- cos_data_ISA : inout std_logic_vector(15 downto 0) := (others => 'Z'); cos_ADDR_ISA : out std_logic_vector(15 downto 0) := (others => '0')
); end entity PC104;
architecture rtl of PC104 is begin
cos_RD_n<=ats_s0_read_n; cos_WR_n<=ats_s0_write_n; cos_CS_n<=ats_s0_chipselect_n; cos_ADDR_ISA<=ats_s0_address; --cos_data_ISA<=ats_s0_data when ats_s0_write_n='0' else (others => 'Z'); --ats_s0_data<=cos_data_ISA when ats_s0_read_n='0' else (others => 'Z');
end architecture rtl; -- of new_component И код программы: Цитата #include "sys/alt_stdio.h" #include "system.h" #include "alt_types.h"
int main() { alt_u16 *p=(alt_u16*) (0x20054); alt_putstr("Hello from Nios II!\n"); alt_u16 a,b=0;
while(1) {
a++; *p=a;//работает
b+=5; *p=b;//работает
a=*p;//не читает!!!
}
return 0; } UPD: попробовал вот так: Цитата while(1) {
IOWR_16DIRECT(0x20054, 0, a); c=IORD_16DIRECT(0x20054, 0);
} Вроде пишет и читает, но почему при чтении происходит два обращения?
|
|
|
|
|
Apr 26 2011, 12:44
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
Почитал стандарт на авалон и вот что нашел: Цитата If the master is wider than the slave, data bytes in the master address space map to multiple locations in the slave address space. For example, when a 32-bit master port performs a read transfer from a 16-bit slave port, the system interconnect fabric executes two read transfers on the slave side on consecutive addresses, and presents 32-bits of slave data back to the master port. У меня компонент с 16ти разрядными данными на Авалоне, точнее на тристэйте! Получается, что при записи происходит одно обращение, т.к. переменная объявлена как 16ти разрядная (объявил указатель 32х.р. пошло 2е записи). При чтении же Ниосу нужно 32 разряда, поэтому он и обращается дважды. Придется доработать компонент.
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|