Новые драйвера для ATI Radeon.

Drivers for various video cards
  • а с ними будет работать разрешение 1280х1024 true color? Не то на двух машинах, в которых установлены ATI Xpert2000 (ATI Rage 128 Pro) и ATI Radeon 7500, при выборе 1280х1024 Колибри стартует, но в нижней части экрана чёрная полоса и нет курсора мыши.
  • http://infinity-sound.narod.ru/ati2d.7z аппаратный курсор для ATI 8500 - 9XXX. Если карта не определится то загрузится обычный курсор.
  • а для NVIDIA всё ждать и ждать...
  • По исходникам я понял,что для работы с шиной PCI и памятью драйвер обращается к функциям в ядре.Нужно их где-то задокументировать,а иначе непонятно как под Колибри нужно драйверы писать.Я раньше вообще думал,что о доступе к PCI нужно заботиться самому.

    Serge,а где ты информацию по ATI драйверам брал ?
    А отладку драйвера проводил в досе или прямо в Колибри ?
  • При работе с АС97 я сделал три функции-оболочки для тех что есть в системе

    proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
    proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
    proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword

    pci_api экспортируется напрямую.

    из драверов они видны как
    extrn PciApi
    extrn PciRead32
    extrn PciRead8
    extrn PciWrite8

    Источник старые исходники XFree и драйверы BeOC. Это была старая программа для нереального режима ДОС.
    Код для работы с железом отлаживал в ДОС.
    Потенциально должно работать с ATI 7500 - x300+ Точно не работает с x1000+.
    Список железа есть в исходниках дрвйвера.

    Ещё там есть код для аппаратного рисования закрашенных прямоугольников.
    Возможно удасться сделать рисование произвольных линий.
    Закрашивание кистями, блиттер и анимированные курсоры.
    В новой версии можно будет загрузить собственный курсор (обычный Win 32х32 16 цветов).

    BeOS aka Haiku
    svn://svn.berlios.de/haiku/haiku/trunk/src/add-ons
  • Serge,а ты не пробовал смотреть исходники драйвера DirectFrameBuffere-а ?
    Там обращение к видеокартам происходит напрямую и код довольно понятный(на C).
  • А сорци ядра где? Я так понял что там добавлен указатель на SetHwCursor, через него всё и крутится, сорци бы постотреть, и пора бы kernel_export грузить из внешнего файла.
  • Исходники будут. В драйвере ошибка для 1280Х1024
    изменения в ядре небольшие
    mousedrv.inc
    draw_mouse_under:
    ; return old picture

    cmp [set_hw_cursor], 0
    jz @F
    ret
    @@:

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    save_draw_mouse:

    cmp [set_hw_cursor], 0
    jz @F
    movzx ebx,word [0xfb0c]
    movzx eax,word [0xfb0a]
    push ebx
    push eax
    call [set_hw_cursor]
    ret
    @@:

    set_hw_cursor - указатель на функцию драйвера и одновременно флаг аппаратного курсора.
  • Ghost
    пора бы kernel_export грузить из внешнего файла
    В смысле функции объявленные extrn?
  • Благодаря усилиям Рудольфа, в разработке драйверов для nvidia в haiku продвинулись вроде дальше, чем для ATI. Правда он уже вроде отошел от дел :(
  • Я бегло просмотрел дрова для NV - там нет аппаратого курсора. А вообще без доков сделать драйвер нереально.
  • В исходниках библиотеки SVGAlib есть драйвер аппаратного курсора для NV.
    Вот часть драйвера :

    static int cursor( int cmd, int p1, int p2, int p3, int p4, void *p5) {
    unsigned char *b1, *b2;
    unsigned short *b3;
    unsigned int i, j, k, l, c0, c1;

    switch(cmd){
    case CURSOR_INIT:
    return 1;
    case CURSOR_HIDE:
    __svgalib_outcrtc(0x31,__svgalib_incrtc(0x31)&0xfe); /* disable cursor */
    break;
    case CURSOR_SHOW:
    __svgalib_outcrtc(0x31,__svgalib_incrtc(0x31)|1); /* enable cursor */
    break;
    case CURSOR_POSITION:
    v_writel(p1+(p2<<16), NV_PRAMDAC_GRCURSOR_START_POS);
    break;
    case CURSOR_SELECT:
    i=memory/2-(p1+1);
    if (chip==Riva128) {
    __svgalib_outcrtc(0x31,(__svgalib_incrtc(0x31)&7)|(((~i)&0x1f)<<3));
    } else {
    __svgalib_outcrtc(0x31,(__svgalib_incrtc(0x31)&3)|(((~i)&0x3f)<<2));
    }
    #if 0
    __svgalib_outcrtc(0x30,((~i)&0x3fc0)>>6);
    #else
    __svgalib_outcrtc(0x30,0);
    #endif
    break;
    case CURSOR_IMAGE:
    i=memory/2-(p1+1);
    i=i*2048;
    switch(p2) {
    case 0: /* X11 format, 32x32 */
    b3=malloc(2048);
    b1=(unsigned char *)p5;
    b2=b1+128;
    c0=0x8000|GET15BITCOLOR((p3>>16)&0xff,(p3>>8)&0xff,p3&0xff);
    c1=0x8000|GET15BITCOLOR((p4>>16)&0xff,(p4>>8)&0xff,p4&0xff);
    l=992;
    for(k=0;k<128;k++) {
    int cc1=*(b1+k);
    int cc2=*(b2+k);
    for(j=0;j<8;j++) {
    if(!(cc2&0x80)) *(b3+l)=0; else if (cc1&0x80)
    *(b3+l)=c1; else *(b3+l)=c0;
    l++;
    if((l&0x1f)==0)l-=64;
    cc2<<=1;
    cc1<<=1;
    }
    }
    memcpy(LINEAR_POINTER+i,b3,2048);
    free(b3);
    break;
    case 1: /* nvidia 1555 format 32x32 */
    memcpy(LINEAR_POINTER+i,p5,2048);
    break;
    }
    break;
    }
    return 0;
    }
  • andrew_programmer
    А будет этот код работать на современных картах, и 15-ти битный курсор в 32-х битном режиме?
  • Serge
    http://www.gtlib.gatech.edu/pub/mandrak ... .0.src.rpm
    Размер: 287 KБ (293 334 байт)

    Там есть код для аппаратного курсора на NV (nv_cursor.c и riva_cursor.c), я с кодом думал сам разобраться, но у тебя думаю это получится быстрее. Или напиши что делает xf86MapPciMem(,,,,), я так понял в твоём коде ей соответствует код :

    Code: Select all

               stdcall AllocKernelSpace, dword 0x10000
               test eax, eax
               jz .fail
               mov [ati_io], eax
               stdcall PciRead32, [bus], [devfn], dword 0x18
               and eax, 0xFFFF0000
               mov esi, eax
               mov edi, [ati_io]
               mov edx, 16
    @@:     stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
    	  add edi, 0x1000
               add esi, 0x1000
               dec edx
               jnz @B
    
    P.S. Если будут проблемы с rpm, вот zip http://iam.gorodok.net/NV.zip.
    P.P.S В твоём ядре ещё ощибка с зашитой портов и функ 46
  • Who is online

    Users browsing this forum: No registered users and 1 guest