Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Помогите разобраться с scatterlist структурой


Автор: Nzdrw 21.6.2007, 06:09
выделенные блоки памяти занес в скаттерлист... прочитал в него из usb\
а как посмотреть на данные то? вроде бы sg->page - хранит указатель на N-ый буффер... пробую читать из него... и sg->offset крутил.... везде страшные числа, коих не должно быть smile 
буфер должен заполнятся unsignedd char, а там -2147483520... и т.п.
где лежат данные в этой scatterlist структуре и как до них добраться???
пасибо.

Автор: MAKCim 21.6.2007, 09:27
Код

void *addr = page_address(sg);

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

void *addr = kmap(sg);

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

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

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

Автор: Nzdrw 22.6.2007, 06:11
Говорит 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); 
...

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

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

Автор: Nzdrw 22.6.2007, 09:14
сделал так
Код

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

потом в цикле инкрементирую указатель buf - и самое интересное, что каждое второе число в массиве - 0 ?!... так то вообще все верно сделал?

Автор: MAKCim 22.6.2007, 09:20
Nzdrw, 
функционально правильно
а уж логически смотри сам

Автор: Nzdrw 22.6.2007, 09:21
ну, вроде заработало... спасибо! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)