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

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


Гуру
******

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



Цитата
скорее epcs_write_enable

Точно, вот только замечание Stewart Little по поводу fprintf напрягает.
А разве закрытие файла alt_flash_close_dev(fd); пепред форматным выводом не решает проблему?


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


Гуру
******

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



я, откровенно говоря, вообще не понимаю, почему вы решили использовать форматированный вывод. он предназначен для символьных устройств (поток символов), а флешка - типичное блочное устройство (оперирует блоками), с ними принято работать через read/write. вот и в HAL упоминаются следующие функции для работы с flash:
Цитата
alt_flash_open_dev()
alt_erase_flash_block()
alt_flash_close_dev()
alt_get_flash_info()
alt_read_flash()
alt_write_flash()
alt_write_flash_block()
Go to the top of the page
 
+Quote Post
torik
сообщение Aug 9 2011, 11:51
Сообщение #18


Гуру
******

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



Причем тут флешка и форматный вывод. Форматный вывод fprintf используется только для отладки, для вывода всякой фигни в консоль ниоса. Т.е. только через stdout.

И к флешке не имеет отношения


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


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

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



Цитата(torik @ Aug 9 2011, 15:51) *
Причем тут флешка и форматный вывод. Форматный вывод fprintf используется только для отладки, для вывода всякой фигни в консоль ниоса. Т.е. только через stdout.

Да, похоже я ступил. Приношу свои извинения. laughing.gif
Ну а Вы постарайтесь писать более удобочитаемый код.


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


Гуру
******

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



Цитата(torik @ Aug 9 2011, 18:51) *
И к флешке не имеет отношения

простите, а в чем вопрос-то? sm.gif
Go to the top of the page
 
+Quote Post
torik
сообщение Aug 9 2011, 12:47
Сообщение #21


Гуру
******

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



Цитата
Ну а Вы постарайтесь писать более удобочитаемый код.

Ок.

Цитата
простите, а в чем вопрос-то?


Пожалуй, этот вопрос исчерпан на данный момент. Большое спасибо.



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


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 1-01-06
Из: Волгоград
Пользователь №: 12 763



Код
#include "flash.h"
#include "sys/alt_flash.h"
#include "string.h"

void flash_test (void)
{
    alt_flash_fd * flash_descriptor;
    int ret_code, i;
    alt_u8 source[100] = {0,1,2,3,4,5,6,7,8,9};
    alt_u8 dest[100];


    flash_descriptor = alt_flash_open_dev ("/dev/epcs_flash_controller");
    if (flash_descriptor != NULL)
    {
        printf ("Flash open success!\n");

        ret_code = alt_read_flash (flash_descriptor, 0x70000, dest, 10);
        if (ret_code == 0)
        {
            printf ("read success\n");
            for (i=0; i<10; i++)
            {
                printf ("%d - %d\n", dest[i], source[i]);

            }

            ret_code = alt_write_flash (flash_descriptor, 0x70000, source, 10);
            if (ret_code == 0)
                printf ("write success\n");
            else
                printf ("write fail \n");

        }
        else printf ("read fail\n");

        alt_flash_close_dev (flash_descriptor);
    }
    else printf ("Can't open flash!\n");

}


int flash_read (alt_u8 * buf, alt_u32 addr, alt_u32 length)
{
    alt_flash_fd * flash_descriptor;
    int ret_code;
//    alt_u8 tempbuf[40];

    flash_descriptor = alt_flash_open_dev ("/dev/epcs_flash_controller");
    if (flash_descriptor != NULL)
    {
        ret_code = alt_read_flash (flash_descriptor, addr, buf, length);
        if (ret_code == 0)
        {
            alt_flash_close_dev (flash_descriptor);
            return (1);
        }
        else return (0);
        alt_flash_close_dev (flash_descriptor);
    }
    else return (0);
}

У меня в проекте что-то такое было для теста работы с флешой..
Go to the top of the page
 
+Quote Post
wpost
сообщение Aug 10 2011, 08:16
Сообщение #23


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 1-04-10
Из: СПб
Пользователь №: 56 354



описание структуры
Код
struct EPCS_STRUCT
{
    char *NAME;                           // name EPCS
    alt_flash_fd *p_epcs_fd;             // pointer to EPCS
    flash_region *p_epcs_reg_info;       // Regs info    
    int num_epcs_regs;                   // num regs
    int type;
    alt_u8 sid;
};


функция инициализации
Код
int init_epsc(struct EPCS_STRUCT *EPCS)
{
EPCS->sid =0xff;
EPCS->p_epcs_fd=alt_flash_open_dev(EPCS->NAME); // Get pointer to flash info structure

alt_epcs_flash_get_info(EPCS->p_epcs_fd, &EPCS->p_epcs_reg_info, &EPCS->num_epcs_regs); // Verify flash details

switch (EPCS->p_epcs_reg_info->region_size*EPCS->num_epcs_regs)
    {
        case 131072   : /*printf("Detected EPCS1\n");*/ {EPCS->type =1;EPCS->sid =0x10; break;}
        case 524288   : /*printf("Detected EPCS4\n");*/ {EPCS->type =4;EPCS->sid =0x12; break;}
        case 2097152  : /*printf("Detected EPCS16\n");*/ {EPCS->type =16;EPCS->sid =0x14; break;}
        case 8388608  : /*printf("Detected EPCS64\n");*/ {EPCS->type =64;EPCS->sid =0x16; break;}
        case 16777216 : /*printf("Detected EPCS128\n");*/ {EPCS->type =128;EPCS->sid =0x18; break;}
        EPCS->sid =0xff;return(1);
    }

return(0);
}


Код
int EPCS_READ(struct EPCS_STRUCT *EPCS, int offset, alt_u8 *buf, int len)
{
    int res;

    res = alt_epcs_flash_read(EPCS->p_epcs_fd, offset, buf,len);

    return(res);
}

int EPCS_FULL_ERASE(struct EPCS_STRUCT *EPCS)
{
    int res;
    int i;
    int j;
    alt_u8 bar;

    res = 0;
    switch (EPCS->type)
        {
            case 1   :  for (i=0;i<4;i++)
                                            {    res = res + alt_epcs_flash_erase_block(EPCS->p_epcs_fd, ((i*8)<<12)&(0xff000));
                                                for (j=0;j<1000;j++);
                                            }    break;
            case 4   :  for (i=0;i<8;i++)     {    res = res + alt_epcs_flash_erase_block(EPCS->p_epcs_fd, i*0x010000);
                                                if (i==4)
                                                    for (j=0;j<100000;j++);
                                                for (j=0;j<1000;j++);
                                            }    break;
            case 16  :  for (i=0;i<32;i++)     {    res = res + alt_epcs_flash_erase_block(EPCS->p_epcs_fd, i*0x010000);
                                                if (i==15)
                                                    for (j=0;j<100000;j++);
                                                for (j=0;j<1000;j++);
                                            }    break;
            case 64  :  for (i=0;i<128;i++) {    res = res + alt_epcs_flash_erase_block(EPCS->p_epcs_fd, 0x010000*i);
                                                if (i==63)
                                                    for (j=0;j<100000;j++);
                                            }     break;
            case 128 :  for (i=0;i<64;i++)     {    res = res + alt_epcs_flash_erase_block(EPCS->p_epcs_fd, ((i*4)<<16)&(0xff0000));
                                                bar=1.5625*(i+1);
                                                if (i==10)
                                                    for (j=0;j<100000;j++);
                                                if (i==20)
                                                    for (j=0;j<100000;j++);
                                                if (i==30)
                                                    for (j=0;j<100000;j++);
                                                if (i==40)
                                                    for (j=0;j<100000;j++);
                                                for (j=0;j<1000;j++);
                                            }    break;
                        res = 1;break;
        }

      
    return(res);
}



int EPCS_WRITE(struct EPCS_STRUCT *EPCS,  alt_u32 PTR, int len, alt_u8 *buf)
{
    int res;
   // len <= 256!!!

    res = alt_epcs_flash_write_block(EPCS->p_epcs_fd,0, PTR,
                                          buf,
                                              len);
    return(res);
}



Код
    // инициализация epcs
    EPCS.NAME = EPCNAME;
    if (init_epsc(&EPCS)!= 0)
    printf("EPCS ID %x\n",EPCS.sid);

// ну и дальше пошли читать, стирать, писать....
Go to the top of the page
 
+Quote Post
torik
сообщение Aug 12 2011, 11:24
Сообщение #24


Гуру
******

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



Читабельно. Спасибо.

Перед записью, кстати, нет необходимости стирать записываемый блок (в alt_epcs_flash_write_block это уже предусмотрено)? Вроде не стираю и все пишется нормально.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post

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

 


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


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