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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> запись в EPCS из ниоса, через epcs_flash_controller
torik
сообщение Aug 8 2011, 12:30
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Надо иногда записывать несколько байт в EPCS.

В EPCS64 128 секторов. Хочу последний сектор для данных отвести.

Пишу код:

Код
#include "epcs_commands.h"


unsigned char * epcs_dst;
unsigned int epcs_buff[4];
epcs_dst = &epcs_buff[0];
fprintf(stdout, "\nepcs id = %x", epcs_read_device_id(EPCS_FLASH_CONTROLLER_BASE + EPCS_FLASH_CONTROLLER_REGISTER_OFFSET));
epcs_read_buffer(EPCS_FLASH_CONTROLLER_BASE, 65536*127, epcs_dst, 16);
    fprintf(stdout, "\n1 = %x", epcs_buff[0]);


На функции чтения тупо виснет.

Что интересно, если написать:

Код
fprintf(stdout, "\nepcs id = %x", epcs_read_device_id(EPCS_FLASH_CONTROLLER_BASE));


Тоже виснет.




Где примерчик можно посмотреть? Чё ему не нравится? Всякие галки small в bsp сняты...
















Попробовал везде использовать EPCS_FLASH_CONTROLLER_BASE + EPCS_FLASH_CONTROLLER_REGISTER_OFFSET
Зависать перестало.
Теперь добавляем запись:
Код
epcs_write_enable(EPCS_FLASH_CONTROLLER_BASE + EPCS_FLASH_CONTROLLER_REGISTER_OFFSET);
epcs_sector_erase(EPCS_FLASH_CONTROLLER_BASE + EPCS_FLASH_CONTROLLER_REGISTER_OFFSET, 127);
res = epcs_write_buffer(EPCS_FLASH_CONTROLLER_BASE + EPCS_FLASH_CONTROLLER_REGISTER_OFFSET, 65536*127, epcs_src, 16);

После сброса питания, выяснилось, что прошивка накрылась. Куда-то не туда стер и записал...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Aug 8 2011, 12:36
Сообщение #2


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



А девайс открывать Вы не забываете?


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
torik
сообщение Aug 8 2011, 13:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



А надо ли? Вот функции "epcs_commands.h":
Код
alt_u8 epcs_read_device_id(alt_u32 base);
alt_u8 epcs_read_electronic_signature(alt_u32 base);
alt_u8 epcs_read_status_register(alt_u32 base);
void epcs_sector_erase(alt_u32 base, alt_u32 offset);
alt_32 epcs_read_buffer(alt_u32 base, int offset, alt_u8 *dest_addr, int length);
void epcs_write_enable(alt_u32 base);
void epcs_write_status_register(alt_u32 base, alt_u8 value);
alt_32 epcs_write_buffer(alt_u32 base, int offset, const alt_u8 *src_addr, int length);


А открыть файл - это уже "altera_avalon_epcs_flash_controller.h" и другие функции.


В функцию epcs_sector_erase надо указывать только номер сектора, например 127?

Что-то и с открыванием файлов не получается:
Код
    alt_flash_fd    *p_epcs_fd;
    flash_region    *p_epcs_reg_info;
    int             num_epcs_regs;
    unsigned int epcs_buff[4];

    p_epcs_fd = alt_flash_open_dev("/dev/epcs_flash_controller");
    alt_epcs_flash_get_info(p_epcs_fd, &(p_epcs_reg_info), &(num_epcs_regs));
    alt_epcs_flash_read(p_epcs_fd, 65536*126, (void*)epcs_buff, 16);
    alt_flash_close_dev(p_epcs_fd);


А запись так:
Код
    p_epcs_fd = alt_flash_open_dev("/dev/epcs_flash_controller");
    alt_epcs_flash_erase_block(p_epcs_fd, 126);
    alt_epcs_flash_write_block(p_epcs_fd, 126, 0, (void*)epcs_buff, 16);
    alt_flash_close_dev(p_epcs_fd);


Оно конечно не виснет. Однако после записи, вычитываю все те же ffffffff. И начинает глючить вся программа вообще. Что-то эта запись во влеш где-то не дружит с fprintf.



--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Aug 8 2011, 14:36
Сообщение #4


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Какое значение возвращается из alt_flash_open_dev? Сделайте проверку на NULL.


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
sergtsa
сообщение Aug 8 2011, 15:00
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 4-05-06
Из: Санкт-Петербург
Пользователь №: 16 780



и не забывайте , в EPCS _xxx ограниченное число записей/стираний 100 000 раз.


--------------------
Если ты закроешь глаза на пугающее тебя зрелище, ты перестанешь бояться. А если ты взглянешь на него в упор, то увидишь, что того, чего следовало бы бояться, нет совсем. Акира Куросава.
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Aug 8 2011, 15:10
Сообщение #6


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



upd:
Цитата(torik @ Aug 8 2011, 17:37) *
А надо ли? Вот функции "epcs_commands.h":

Вы уж определитесь, с чем хотите работать - с fprintf или с epcs_command.h.
И посмотрите вот эту тему: http://electronix.ru/forum/index.php?showt...st&p=955010

Цитата(sergtsa @ Aug 8 2011, 19:00) *
и не забывайте , в EPCS _xxx ограниченное число записей/стираний 100 000 раз.

Не вводите в заблуждение!!!
Цитата из DS: "Re-programmable memory with more than 100,000 erase/program cycles" (см. http://www.altera.com/literature/hb/cfg/cyc_c51014.pdf).
А насколько "more than", там не написано sm.gif
Т.о., имеет смысл говорить, что гарантированное кол-во циклов записи-стирания для EPCS не менее 100000 (и это во всем диапазоне температур и напряжений питания).


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Aug 8 2011, 15:14
Сообщение #7


Гуру
******

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



примеры чтения/записи с использованием epcs_commands.h
Код
void    RdEPCS_Set()
{
    epcs_read_buffer(EPCS_CONTROLLER_BASE+EPCS_CONTROLLER_REGISTER_OFFSET,
    EPCS_SET_OFFS, EPCS_buffer, EPCS_BUF_SIZE);
}
//---------------------------------------------------------------------------------------------
void    WrEPCS_Set()
{
    epcs_sector_erase(EPCS_CONTROLLER_BASE+EPCS_CONTROLLER_REGISTER_OFFSET,EPCS_SET_OFFS);
    epcs_write_buffer(EPCS_CONTROLLER_BASE+EPCS_CONTROLLER_REGISTER_OFFSET,
                              EPCS_SET_OFFS, EPCS_buffer, EPCS_BUF_SIZE);
}

EPCS_CONTROLLER_REGISTER_OFFSET - смещение контроллера SPI, который встроен в компонент EPCS_CONTROLLER (см. system.h)
EPCS_SET_OFFS - смещение на флешке в байтах, а не в номерах страниц
остальное - указатель на буфер и его размер
Go to the top of the page
 
+Quote Post
sergtsa
сообщение Aug 8 2011, 15:20
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 4-05-06
Из: Санкт-Петербург
Пользователь №: 16 780



Цитата(Stewart Little @ Aug 8 2011, 19:10) *
upd:

Не вводите в заблуждение!!!
Цитата из DS: "Re-programmable memory with more than 100,000 erase/program cycles" (см. http://www.altera.com/literature/hb/cfg/cyc_c51014.pdf).
А насколько "more than", там не написано sm.gif
Т.о., имеет смысл говорить, что гарантированное кол-во циклов записи-стирания для EPCS не менее 100000 (и это во всем диапазоне температур и напряжений питания).

не хотел никого ввести в заблуждение.
я так и написал )) 100 000 записей / стираний. (это то на что можно рассчитывать, а расчитывать на "более чем 100 000" я бы не стал)
при хранении в EPCS перезаписываемых данных, просто не надо забывать про это , чтоб не убить частыми записями.

Сообщение отредактировал sergtsa - Aug 8 2011, 15:25


--------------------
Если ты закроешь глаза на пугающее тебя зрелище, ты перестанешь бояться. А если ты взглянешь на него в упор, то увидишь, что того, чего следовало бы бояться, нет совсем. Акира Куросава.
Go to the top of the page
 
+Quote Post
torik
сообщение Aug 9 2011, 04:50
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Цитата
Вы уж определитесь, с чем хотите работать - с fprintf или с epcs_command.h.

Не понял связи. Не вижу где написано, что нельзя одновременно работать с fprintf и с epcs_command.h. Чё-то упустил?

Переделал все по-другому. Во-первых, в этой теме
http://electronix.ru/forum/index.php?showt...l=alt_flash_dev
вычитал про
Код
#define ALT_USE_EPCS_FLASH
#include "altera_avalon_epcs_flash_controller.h"

в system_init.c
Это неудобно, т.к. после перегенерации bsp приходится по-новой добавлять эту строку. Но если снять галку reduced_devices_drivers, то глюки возвращаются.

Чтение делаю так:
Код
alt_flash_fd    *fd;
unsigned int epcs_buff[4];
fd = alt_flash_open_dev("/dev/epcs_flash_controller");
if (fd != NULL) {
    printf ("\nopen OK");
    alt_epcs_flash_read(fd, 65536*126, (void*)epcs_buff, 16);
}
alt_flash_close_dev(fd);


А запись делаю так:
Код
fd = alt_flash_open_dev("/dev/epcs_flash_controller");
if (fd != NULL) {
   alt_epcs_flash_erase_block(fd, 126);
   alt_epcs_flash_write_block(fd, 0, 65536*126, (void*)epcs_buff, 16);
}
alt_flash_close_dev(fd);

Вот тут особенность, которую вычитал где-то на альтеровском форуме.
при стирании указывается номер сектора. Взял предпоследний для EPCS64. В функции запими, по идее, второй аргумнт должен соответсвовать номеру сектора, а третий смещению внутри него. Так вот, второй аргумент игнорируется, а в третьем нужно указывать адрес целиком.
Сейчас все работает. И даже fprintf не глючит.
Кто ошибки видит?




--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Aug 9 2011, 05:37
Сообщение #10


Гуру
******

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



Цитата(torik @ Aug 9 2011, 11:50) *
Взял предпоследний для EPCS64. В функции запими, по идее, второй аргумнт должен соответсвовать номеру сектора, а третий смещению внутри него. Так вот, второй аргумент игнорируется, а в третьем нужно указывать адрес целиком.


Код
/* Write, assuming that someone has kindly erased the appropriate
* sector(s).
* Note: "block_offset" is the base of the current erase block.
* "data_offset" is the absolute address (from the 0-base of this
* device's memory) of the beginning of the write-destination.
* This device has no need for "block_offset", but it's included for
* function type compatibility.
*/
int alt_epcs_flash_write_block
все адреса абсолютные.
а вариант, что я выше предлагал чем не нравится? памяти, кстати, меньше будет жрать. и с reduced device drivers будет работать
Go to the top of the page
 
+Quote Post
torik
сообщение Aug 9 2011, 06:03
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Код
а вариант, что я выше предлагал чем не нравится? памяти, кстати, меньше будет жрать. и с reduced device drivers будет работать

Что-то он у меня глючил. Но проверю еще разок.
Код
alt_epcs_flash_erase_block(fd, 126)
- рушит прошивку.
оставил только
Код
alt_epcs_flash_write(fd, 65536*126, (void*)epcs_buff, 16);

Похоже что в этой функции автоматически стирается нужный блок.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Aug 9 2011, 06:06
Сообщение #12


Гуру
******

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



Цитата(torik @ Aug 9 2011, 13:03) *
Код
alt_epcs_flash_erase_block(fd, 126)
- рушит прошивку.

естественно, стирается нулевой сектор. я же писал, все адреса в байтах
Go to the top of the page
 
+Quote Post
torik
сообщение Aug 9 2011, 06:52
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Цитата
а вариант, что я выше предлагал чем не нравится? памяти, кстати, меньше будет жрать. и с reduced device drivers будет работать

Попробовал. Что-то не записывает нифига то что надо:
Код
epcs_sector_erase(EPCS_FLASH_CONTROLLER_BASE+EPCS_FLASH_CONTROLLER_REGISTER_OFFSET, 65536*126);
epcs_write_buffer(    EPCS_FLASH_CONTROLLER_BASE+EPCS_FLASH_CONTROLLER_REGISTER_OFFSET, 65536*126,
        (void*)epcs_buff, 16);

epcs_read_buffer(EPCS_FLASH_CONTROLLER_BASE+EPCS_FLASH_CONTROLLER_REGISTER_OFFSET, 65536*126, (void*)epcs_buff, 16);

Опять небось какой-нибудь флеш_инит нужно делать или еще чего забыл?





--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Aug 9 2011, 08:13
Сообщение #14


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Цитата(torik @ Aug 9 2011, 08:50) *
Не понял связи. Не вижу где написано, что нельзя одновременно работать с fprintf и с epcs_command.h. Чё-то упустил?

Упустил, упустил.
Если Вы собираетесь писать в файл (то бишь в девайс) - fprintf - то этот файл нужно как минимум открыть.
( bb-offtopic.gif навевает аналогию - Рецепт приготовления кролика: пункт 1. Поймайте кролика...).

Если собираетесь работать с EPCS'кой на низком уровне (с использованием функций из epcs_command.h) - как предлагаем уважаемый vadimuzzz, то забудьте про форматированный вывод.

А смешивать первое со вторым в одном и том же приложении - это прямой путь к выносу мозга sm.gif


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Aug 9 2011, 08:57
Сообщение #15


Гуру
******

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



Цитата(torik @ Aug 9 2011, 13:52) *
Опять небось какой-нибудь флеш_инит нужно делать или еще чего забыл?

скорее epcs_write_enable.
вот только что проверил:
CODE

unsigned char e_buf[16];
epcs_write_enable(EPCS_FLASH_CONTROLLER_0_BASE+EPCS_FLASH_CONTROLLER_0_REGISTER_
OFFSET);
epcs_sector_erase(EPCS_FLASH_CONTROLLER_0_BASE+EPCS_FLASH_CONTROLLER_0_REGISTER_
OFFSET,EPCS_SET_OFFS);
epcs_read_buffer(EPCS_FLASH_CONTROLLER_0_BASE+EPCS_FLASH_CONTROLLER_0_REGISTER_O
FFSET,EPCS_SET_OFFS,e_buf,16);
for(t=0;t<16;t++)
alt_printf("e_buf[%x]=%x\n",t,e_buf[t]);
for(t=0;t<16;t++)
e_buf[t] = t;
epcs_write_buffer(EPCS_FLASH_CONTROLLER_0_BASE+EPCS_FLASH_CONTROLLER_0_REGISTER_
OFFSET,EPCS_SET_OFFS,e_buf,16);
for(t=0;t<16;t++)
alt_printf("e_buf[%x]=%x\n",t,e_buf[t]);
for(t=0;t<16;t++)
e_buf[t]=0;
for(t=0;t<16;t++)
alt_printf("e_buf[%x]=%x\n",t,e_buf[t]);
epcs_read_buffer(EPCS_FLASH_CONTROLLER_0_BASE+EPCS_FLASH_CONTROLLER_0_REGISTER_O
FFSET,EPCS_SET_OFFS,e_buf,16);
for(t=0;t<16;t++)
alt_printf("e_buf[%x]=%x\n",t,e_buf[t]);

выхлоп:
CODE
e_buf[0]=ff
e_buf[1]=ff
e_buf[2]=ff
e_buf[3]=ff
e_buf[4]=ff
e_buf[5]=ff
e_buf[6]=ff
e_buf[7]=ff
e_buf[8]=ff
e_buf[9]=ff
e_buf[a]=ff
e_buf[b]=ff
e_buf[c]=ff
e_buf[d]=ff
e_buf[e]=ff
e_buf[f]=ff
e_buf[0]=0
e_buf[1]=1
e_buf[2]=2
e_buf[3]=3
e_buf[4]=4
e_buf[5]=5
e_buf[6]=6
e_buf[7]=7
e_buf[8]=8
e_buf[9]=9
e_buf[a]=a
e_buf[b]=b
e_buf[c]=c
e_buf[d]=d
e_buf[e]=e
e_buf[f]=f
e_buf[0]=0
e_buf[1]=0
e_buf[2]=0
e_buf[3]=0
e_buf[4]=0
e_buf[5]=0
e_buf[6]=0
e_buf[7]=0
e_buf[8]=0
e_buf[9]=0
e_buf[a]=0
e_buf[b]=0
e_buf[c]=0
e_buf[d]=0
e_buf[e]=0
e_buf[f]=0
e_buf[0]=0
e_buf[1]=1
e_buf[2]=2
e_buf[3]=3
e_buf[4]=4
e_buf[5]=5
e_buf[6]=6
e_buf[7]=7
e_buf[8]=8
e_buf[9]=9
e_buf[a]=a
e_buf[b]=b
e_buf[c]=c
e_buf[d]=d
e_buf[e]=e
e_buf[f]=f
Go to the top of the page
 
+Quote Post

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

 


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


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