Перейти к содержанию
    

как то не понятно, как эту флеш писать читать?

считали блок->изменили часть данных->записали блок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как то не понятно, как эту флеш писать читать?

Вы сперва разберитесь, как вообще Flash работает. Чтение из флэши возможно и побайтное, и пословное. А вот стирание и запись - посекторные. См. предыдущий ответ ув. vadimuzzz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы сперва разберитесь, как вообще 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? Поделитесь, заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и "считали блок->изменили часть данных->записали блок" это какой-то низкоуровневый алгоритм.

для флешек с блочным стиранием это обычное дело. 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, &regions, &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 посмотрите, как запись организована. имейте в виду, что там не производится проверка адресов на предмет перекрытия соседних блоков. эту проверку вы должны делать сами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да уш не 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?

не должна

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а она у вас CFI_FLASH_0_NAME называется? в system.h посмотрите.
У меня CFI_FLASH_NAME, соответственно вызов делаю с именем CFI_FLASH_NAME. пробовал "/dev/cfi_flash" (из тогоже систем.аш) - тозе возвращает 0

 

нет. диагностировать подключение удобно при помощи nios2-flash-programmer. пускаете его с ключом --debug и смотрите, что он там пишет.

выхлоп nios2-flash-programmer на картинке. Это нормальная работа флешки?

post-49045-1303286596_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выхлоп 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

 

а какая у вас борда?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно, даже если вы напишите функции которые позволяют дописать два байта в произвольное место флеши (по принципу чтение блока, модификация блока, запись байтов), то пользоваться ими беспроблемно не получится - время записи блока у флешей может быть достаточно большим (0.1 - 0.5 секунды), так что наваливать по десятку байт скорее всего окажется накладно - придется так или иначе учитывать специфику флеши.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуете! Начинаю работать с Ниос!

 

Создал свой компонент, прицепил к ниосу, все нормально!

 

Далее начинаю писать по адресу (через указатель) - тоже все работает!

 

А вот чтение не получается! Может подскажете как надо!?

 

прилагаю код компонента:

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);

 

}

 

Вроде пишет и читает, но почему при чтении происходит два обращения?

 

post-52939-1303811176_thumb.jpg

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде пишет и читает, но почему при чтении происходит два обращения?

возможно, занята шина. надо еще waitrequest смотреть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почитал стандарт на авалон и вот что нашел:

 

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 разряда, поэтому он и обращается дважды. Придется доработать компонент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заинтересовала меня вот эта штука Remote System Upgrade. Только не догоняю, она может полностью переконфигурировать плис (СIII)? Даже если новая прошивка будет без ниоса? Или тут какие то нюансы есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заинтересовала меня вот эта штука Remote System Upgrade. Только не догоняю, она может полностью переконфигурировать плис (СIII)? Даже если новая прошивка будет без ниоса? Или тут какие то нюансы есть?

да, может. ниос не обязателен, компонент в SOPC - это просто обертка к мегафункции. но с процом, конечно, удобнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...