Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Eugene Grosbein                      2:5006/1       10 Mar 2004  23:56:24
 To : All
 Subject : странный случай
 -------------------------------------------------------------------------------- 
 
 
 Hаписал тут программку, она работает, задачу свою решает.
 Hо вот как и что она делает - хоть убей, не пойму :-(
 
 Предыстория. Если взять карточку ATI Radeon VIVO 9200 и воткнуть ее
 Video Out в телевизор, она (это фича, не бага) при загрузке машины
 на монитор выдает 50Hz и картинка занимает где-то две трети
 экрана по вертикали. Это ужасно.
 
 Машина dual boot, Win98SE/FreeBSD. Если прогрузиться в винду или во фрю
 в графику, выдается какой положено рефреш. Под виндой full screen dos box
 идет в штатных 70Hz и на полный экран, под фрей те же 50Hz. Зовем шамана.
 
 Утиль для магических пассов (идея нагло уворована через freebsd.rambler.ru):
 
 #include <sys/types.h>
 #include <machine/cpufunc.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <err.h>
 
 #define LEN 25
 int main(int argc, char* argv[])
 {
   unsigned char crtc[LEN];
   unsigned char reg;
   unsigned i, ch;
 
   if (!open("/dev/io",O_RDONLY))
     err(1,"/dev/io");
 
   while ((ch = getopt(argc, argv, "w")) != -1)
     switch (ch) {
 
     case 'w':
       for (reg=0;reg<0x19;++reg)
         if (scanf("%u ",&i) ==1 ) crtc[reg]=(unsigned char)i;
         else errx(1,"invalid input, decimal values expected");
 
       outb(0x3d4,0x11);
       outb(0x3d5,crtc[0x11]&0x7f);
       for (reg=0;reg<0x19;++reg) {
         outb(0x3d4,reg);
         outb(0x3d5,crtc[reg]);
       }
       return 0;
     }
 
   for (reg=0;reg<0x19;++reg) {
     outb(0x3d4,reg);
     crtc[reg]=inb(0x3d5);
     printf ("%u ",(unsigned)(crtc[reg]));
   }
   puts ("");
 
   return 0;
 }
 /* EOF */
 
 Код присал даже не на коленке, а на весу; не ругайтесь сильно.
 
 Компилируем в ./vesareg, загрузившись без телевизора говорим рутом:
 ./vesareg > 80x25.vg
 
 Перезагрузившись с телевизором, говорим рутом:
 ./vesareg -w < 80x25.vg
 
 Ура, имеем нормальную консоль. Кто-нибудь может дать хорошее объяснение
 происходящему? Разумеется, не на уровне комментариев
 /* записать 0x19 в reg */, а по сути?
 
 Eugene
 --- slrn/0.9.8.0 (FreeBSD)
  * Origin: Svyaz Service JSC (2:5006/1@fidonet)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 странный случай   Eugene Grosbein   10 Mar 2004 23:56:24 
 Re: странный случай   Eugene Grosbein   12 Mar 2004 03:25:01 
Архивное /ru.unix.bsd/26093d9cb6b0c.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional