|
запись в EPCS из ниоса, через epcs_flash_controller |
|
|
|
Aug 8 2011, 12:30
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 8 2011, 13:37
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 8 2011, 15:00
|
Частый гость
 
Группа: Свой
Сообщений: 117
Регистрация: 4-05-06
Из: Санкт-Петербург
Пользователь №: 16 780

|
и не забывайте , в EPCS _xxx ограниченное число записей/стираний 100 000 раз.
--------------------
Если ты закроешь глаза на пугающее тебя зрелище, ты перестанешь бояться. А если ты взглянешь на него в упор, то увидишь, что того, чего следовало бы бояться, нет совсем. Акира Куросава.
|
|
|
|
|
Aug 8 2011, 15:10
|

Лентяй
     
Группа: Свой
Сообщений: 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", там не написано  Т.о., имеет смысл говорить, что гарантированное кол-во циклов записи-стирания для EPCS не менее 100000 (и это во всем диапазоне температур и напряжений питания).
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Aug 8 2011, 15:14
|

Гуру
     
Группа: Свой
Сообщений: 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 - смещение на флешке в байтах, а не в номерах страниц остальное - указатель на буфер и его размер
|
|
|
|
|
Aug 8 2011, 15:20
|
Частый гость
 
Группа: Свой
Сообщений: 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", там не написано  Т.о., имеет смысл говорить, что гарантированное кол-во циклов записи-стирания для EPCS не менее 100000 (и это во всем диапазоне температур и напряжений питания). не хотел никого ввести в заблуждение. я так и написал )) 100 000 записей / стираний. (это то на что можно рассчитывать, а расчитывать на "более чем 100 000" я бы не стал) при хранении в EPCS перезаписываемых данных, просто не надо забывать про это , чтоб не убить частыми записями.
Сообщение отредактировал sergtsa - Aug 8 2011, 15:25
--------------------
Если ты закроешь глаза на пугающее тебя зрелище, ты перестанешь бояться. А если ты взглянешь на него в упор, то увидишь, что того, чего следовало бы бояться, нет совсем. Акира Куросава.
|
|
|
|
|
Aug 9 2011, 04:50
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 9 2011, 05:37
|

Гуру
     
Группа: Свой
Сообщений: 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 будет работать
|
|
|
|
|
Aug 9 2011, 06:03
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 9 2011, 06:52
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 9 2011, 08:13
|

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

|
Цитата(torik @ Aug 9 2011, 08:50)  Не понял связи. Не вижу где написано, что нельзя одновременно работать с fprintf и с epcs_command.h. Чё-то упустил? Упустил, упустил. Если Вы собираетесь писать в файл (то бишь в девайс) - fprintf - то этот файл нужно как минимум открыть. (  навевает аналогию - Рецепт приготовления кролика: пункт 1. Поймайте кролика...). Если собираетесь работать с EPCS'кой на низком уровне (с использованием функций из epcs_command.h) - как предлагаем уважаемый vadimuzzz, то забудьте про форматированный вывод. А смешивать первое со вторым в одном и том же приложении - это прямой путь к выносу мозга
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Aug 9 2011, 08:57
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|