Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


l780.c bugs (linux)

Вы не вошли.

 Поиск | Регистрация | Вход 

Стас
14.05.2004 14:18:22
#1

Гость

l780.c bugs (linux)

По просьбам трудящихся;))) пользователей проверяю что надо исправить в тексте драйвера l780.c из комплекта lcdrv-2.6.


1) Опечатка в обработке вызова ioctl(dev, SNDCTL_DSP_GETIPTR, &ci)

Было
if(sm.sync_type & SYNC_TYPE_DIGITAL)
   {
    if(sm.sync_type & SYNC_TYPE_FRAME) i = 0;/*Digital frame sync */
    else i = 1;  /* Digital start sync */
   }
   else if(sm.sync_type & SYNC_TYPE_ANALOG) i = 2; /* Analog start sync */

стало

if(sm.sync_type & SYNC_TYPE_DIGITAL) i = 0;  /* digital sync*/
if(sm.sync_type & SYNC_TYPE_FRAME) i = 1;  /* frame sync */
if(sm.sync_type & SYNC_TYPE_ANALOG) i = 2;  /* analog sync */

Иначе режим кадровой синхронизации не будет включаться.


to be continued...;)))

Стас
14.05.2004 15:03:57
#2

Гость

Re: l780.c bugs (linux)

2) В обработке ioctl(dev, SNDCTL_DSP_CHANNELS, &ft->frame_rate)
не нужно вызывать команду лбиоса C_ENABLE_ADC (0x0002):

строчка enable_adc(b, 1); лишняя

Стас
14.05.2004 16:00:03
#3

Гость

Re: l780.c bugs (linux)

3) В ядре 2.6.6 изменился порядок работы с POSIX IPC вызовами. Решение надо искать например здесь: http://www-users.mat.uni.torun.pl/~wrona/posix_ipc/

у меня в последнем варианте были отличия в device_mmap(struct file *file, struct vm_area_struct *vma)

было и работало
addr = virt_to_phys(b->InBuf.data);
...
return addr;

стало и пока не работает
addr = virt_to_phys(fb->data);
...
return 0;

Ессно маппинг не работает (да он мне пока и не нужен).

Стас
14.05.2004 16:08:08
#4

Гость

Re: l780.c bugs (linux)

4) В критических местах inttask() я ставлю cli/sti, хотя это конечно дело вкуса.

Стас
28.06.2004 15:01:04
#5

Гость

Re: l780.c bugs (linux)

5) В драйвере не было реализовано чтение калибровочных коэффициентов ацп.

A> Надо добавить функцию:

static int load_coeff(BOARD_STRUCT *b)
{
   int i, m;

   m = sizeof(BOARD_DESCR) / sizeof(DM_WORD);
   eeprom_read(b, 0, (DM_WORD*) &b->descr, m);

   for(i=0; i < 4; i++) put_dm_word(b, b->var + L_ZERO+i, b->descr.KoefADC[i]);
   for(i=4; i < 8; i++) put_dm_word(b, b->var + L_SCALE+i, b->descr.KoefADC[i]);
   return 1;
}

B> и её вызов например в set_adc_timing():

с = load_coeff(b);
set_var(b, L_CORRECTION_ENABLE, 1);


C> дополнить в lbios.h в структуре:

typedef struct _BOARD_DESCR
{
char serial[9];
char name[5];
char revision;
char dsp_type[5];
long freq;
unsigned short is_dac;
unsigned short _res[7];
short KoefADC[8];
short KoefDAC[4];
short Custom[32];

} BOARD_DESCR;

зы Есть какие-то странности в считывании из EEPROM.