vadimuzzz 0 19 апреля, 2011 Опубликовано 19 апреля, 2011 · Жалоба как то не понятно, как эту флеш писать читать? считали блок->изменили часть данных->записали блок Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 19 апреля, 2011 Опубликовано 19 апреля, 2011 · Жалоба как то не понятно, как эту флеш писать читать? Вы сперва разберитесь, как вообще Flash работает. Чтение из флэши возможно и побайтное, и пословное. А вот стирание и запись - посекторные. См. предыдущий ответ ув. vadimuzzz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 апреля, 2011 Опубликовано 20 апреля, 2011 · Жалоба Вы сперва разберитесь, как вообще 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? Поделитесь, заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 20 апреля, 2011 Опубликовано 20 апреля, 2011 · Жалоба Ну и "считали блок->изменили часть данных->записали блок" это какой-то низкоуровневый алгоритм. для флешек с блочным стиранием это обычное дело. 3-4 вызова функций HAL, что тут низкоуровневого? вот дергать alt_flash_cfi_write - это и есть низкоуровневый доступ. а так можно и с SPI-ными флешками работать Потом, тут есть регион и есть блок. Что такое регион я так и не понял. Что такое блок - понятно. Вся флеш разбита на блоки (по пдф), причем размер блоков разный. А вот что такое регион - ??? смотрите даташит на свою флешку, там все расписано. например, у меня интеловская p30. имеет 2 региона с разными размерами блоков в первом 32кбайтные, во втором (основном) - 128 кбайтные. пример кода: #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 посмотрите, как запись организована. имейте в виду, что там не производится проверка адресов на предмет перекрытия соседних блоков. эту проверку вы должны делать сами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 апреля, 2011 Опубликовано 20 апреля, 2011 · Жалоба 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 20 апреля, 2011 Опубликовано 20 апреля, 2011 · Жалоба да уш не 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 и смотрите, что он там пишет. эта open(),,,,,,,, она работает (должна работать) с cfi flash? не должна Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 апреля, 2011 Опубликовано 20 апреля, 2011 · Жалоба а она у вас CFI_FLASH_0_NAME называется? в system.h посмотрите.У меня CFI_FLASH_NAME, соответственно вызов делаю с именем CFI_FLASH_NAME. пробовал "/dev/cfi_flash" (из тогоже систем.аш) - тозе возвращает 0 нет. диагностировать подключение удобно при помощи nios2-flash-programmer. пускаете его с ключом --debug и смотрите, что он там пишет. выхлоп nios2-flash-programmer на картинке. Это нормальная работа флешки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 20 апреля, 2011 Опубликовано 20 апреля, 2011 · Жалоба выхлоп nios2-flash-programmer на картинке. Это нормальная работа флешки? нет, похоже проблема с подключением. вот как примерно должно выглядеть: 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 а какая у вас борда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 апреля, 2011 Опубликовано 20 апреля, 2011 · Жалоба а какая у вас борда? DE0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reanimatorr 1 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Собственно, даже если вы напишите функции которые позволяют дописать два байта в произвольное место флеши (по принципу чтение блока, модификация блока, запись байтов), то пользоваться ими беспроблемно не получится - время записи блока у флешей может быть достаточно большим (0.1 - 0.5 секунды), так что наваливать по десятку байт скорее всего окажется накладно - придется так или иначе учитывать специфику флеши. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Здравствуете! Начинаю работать с Ниос! Создал свой компонент, прицепил к ниосу, все нормально! Далее начинаю писать по адресу (через указатель) - тоже все работает! А вот чтение не получается! Может подскажете как надо!? прилагаю код компонента: 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); } Вроде пишет и читает, но почему при чтении происходит два обращения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Вроде пишет и читает, но почему при чтении происходит два обращения? возможно, занята шина. надо еще waitrequest смотреть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Почитал стандарт на авалон и вот что нашел: 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 разряда, поэтому он и обращается дважды. Придется доработать компонент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 28 апреля, 2011 Опубликовано 28 апреля, 2011 · Жалоба Заинтересовала меня вот эта штука Remote System Upgrade. Только не догоняю, она может полностью переконфигурировать плис (СIII)? Даже если новая прошивка будет без ниоса? Или тут какие то нюансы есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 28 апреля, 2011 Опубликовано 28 апреля, 2011 · Жалоба Заинтересовала меня вот эта штука Remote System Upgrade. Только не догоняю, она может полностью переконфигурировать плис (СIII)? Даже если новая прошивка будет без ниоса? Или тут какие то нюансы есть? да, может. ниос не обязателен, компонент в SOPC - это просто обертка к мегафункции. но с процом, конечно, удобнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться