Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с scatterlist структурой 
:(
    Опции темы
Nzdrw
Дата 21.6.2007, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



выделенные блоки памяти занес в скаттерлист... прочитал в него из usb\
а как посмотреть на данные то? вроде бы sg->page - хранит указатель на N-ый буффер... пробую читать из него... и sg->offset крутил.... везде страшные числа, коих не должно быть smile 
буфер должен заполнятся unsignedd char, а там -2147483520... и т.п.
где лежат данные в этой scatterlist структуре и как до них добраться???
пасибо.
PM MAIL   Вверх
MAKCim
Дата 21.6.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Код

void *addr = page_address(sg);

или для надежности
Код

void *addr = kmap(sg);


Это сообщение отредактировал(а) MAKCim - 21.6.2007, 09:29


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Nzdrw
Дата 21.6.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



это начальный адрес всех(с этого адреса все страницы непрерывно расположены) страниц... или страницы листать надо в sg->pages?

PM MAIL   Вверх
MAKCim
Дата 21.6.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Nzdrw @  21.6.2007,  09:41 Найти цитируемый пост)
это начальный адрес всех(с этого адреса все страницы непрерывно расположены) страниц... или страницы листать надо в sg->pages?

нет, это одна страница (данные расположены на ней по смещению offset и размера length)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Nzdrw
Дата 22.6.2007, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



Говорит segmentation error :( 
вот кусок кода из пробы, где инициализируется SG и там же происходит вызов фунции передачи + код инициализации и usb передачи... HELP!!!
Код

static struct scatterlist *
alloc_sglist (int num_bufs, unsigned int size)
{
    struct scatterlist    *sg;
    unsigned        i;
    
    sg = kmalloc (num_bufs * sizeof *sg, GFP_KERNEL);
    if (!sg)
        return NULL;

    for (i = 0; i < num_bufs; i++) {
        char        *buf;

        buf = kmalloc (size, GFP_KERNEL);
        memset (buf, 155, size);
        if (!buf) {
            free_sglist (sg, i);
            return NULL;
        }
        memset (buf, 0, size);

        /* kmalloc pages are always physically contiguous! */
        sg_init_one(&sg[i], buf, size);
    }
    info ("Buffer S/G op. done");
    return sg;
}
// передача
static int perform_sglist (
    struct usb_device    *udev,
    unsigned        iterations,
    int            pipe,
    struct usb_sg_request    req,
    struct scatterlist    *sg,
    int            nents
)
{
    int            retval = 0;

    retval = usb_sg_init (&req, udev, pipe,
                0,
                sg, nents, 1310720, GFP_KERNEL);
        
        if (retval)
            return -111;
        usb_sg_wait (&req);
        retval = req.bytes;

        /* FIXME if endpoint halted, clear halt (and log) */
    

        info(" retval = %d" ,retval);
    if (retval)
        dbg ("perform_sglist failed, iterations left %d, status %d",
                iterations, retval);
    return retval;
}
 /////////////////////////  Кусок пробы...
...
struct scatterlist *mem;
    struct usb_sg_request io;
    memset (&io, 0, sizeof(struct usb_sg_request));
        
    
    mem = alloc_sglist(128, 10240);    // num, size;
    //for (i = 0; i<150; i++){
    if (!reg_w(dev,0xD0,1)) { info ("error in next frame");
    }
    perform_sglist (dev->udev, 
            128, 
            usb_rcvbulkpipe(dev->udev, 2), 
            io,
            mem,
            128);
    
    unsigned char *addr = kmap(mem);  - и тут он ругаццо!
    
    info("%d", *addr); 
...

PM MAIL   Вверх
MAKCim
Дата 22.6.2007, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Nzdrw @  22.6.2007,  06:11 Найти цитируемый пост)
mem = alloc_sglist(128, 10240);

mem - это же не struct page*, а struct scatterlist*
а в kmap() нужно struct page* передавать


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Nzdrw
Дата 22.6.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



сделал так
Код

void *addr = kmap(mem->page); // mem - sg структура
UCHAR *buf = addr;
info ("%d", *buf);

потом в цикле инкрементирую указатель buf - и самое интересное, что каждое второе число в массиве - 0 ?!... так то вообще все верно сделал?
PM MAIL   Вверх
MAKCim
Дата 22.6.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Nzdrw
функционально правильно
а уж логически смотри сам


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Nzdrw
Дата 22.6.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



ну, вроде заработало... спасибо! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.