Имею DVB приемник tt-1401.
Здесь cкачал на него драйвер и пытаюсь скомпелировать. Хочу сказать - что на обычном ядре в 9.10 и на rt-ядре в 9.04, я это проделывал неоднократно, и как правило всегда успешно.
Но здесь компилятор вот так вот ругается:
CC [M] /home/kingoff/v4l-dvb-74ad936bcca2/v4l/dvb_demux.o
CC [M] /home/kingoff/v4l-dvb-74ad936bcca2/v4l/dvb_filter.o
CC [M] /home/kingoff/v4l-dvb-74ad936bcca2/v4l/dvb_ca_en50221.o
CC [M] /home/kingoff/v4l-dvb-74ad936bcca2/v4l/dvb_frontend.o
/home/kingoff/v4l-dvb-74ad936bcca2/v4l/dvb_frontend.c: In function 'dvb_frontend_stop':
/home/kingoff/v4l-dvb-74ad936bcca2/v4l/dvb_frontend.c:707: error: implicit declaration of function 'init_MUTEX'
make[3]: *** [/home/kingoff/v4l-dvb-74ad936bcca2/v4l/dvb_frontend.o] Error 1
make[2]: *** [_module_/home/kingoff/v4l-dvb-74ad936bcca2/v4l] Error 2
make[2]: Leaving directory `/usr/src/linux-headers-2.6.31-9-rt'
make[1]: *** [default] Ошибка 2
make[1]: Выход из каталога `/home/kingoff/v4l-dvb-74ad936bcca2/v4l'
make: *** [all] Ошибка 2
kingoff@UD:~/v4l-dvb-74ad936bcca2$
Мне посоветовали использовать патч для dvb_frontend.c
diff --git a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
index f50ca72..28f0e3f 100644
--- dvb_frontend.c
+++ dvb_frontend.c
@@ -101,7 +101,7 @@ struct dvb_frontend_private {
struct dvb_device *dvbdev;
struct dvb_frontend_parameters parameters;
struct dvb_fe_events events;
- struct semaphore sem;
+ struct anon_semaphore sem;
struct list_head list_head;
wait_queue_head_t wait_queue;
struct task_struct *thread;
@@ -189,12 +189,12 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
if (flags & O_NONBLOCK)
return -EWOULDBLOCK;
- up(&fepriv->sem);
+ anon_up(&fepriv->sem);
ret = wait_event_interruptible (events->wait_queue,
events->eventw != events->eventr);
- if (down_interruptible (&fepriv->sem))
+ if (anon_down_interruptible (&fepriv->sem))
return -ERESTARTSYS;
if (ret < 0)
@@ -534,7 +534,7 @@ static int dvb_frontend_thread(void *data)
set_freezable();
while (1) {
- up(&fepriv->sem); /* is locked when we enter the thread... */
+ anon_up(&fepriv->sem); /* is locked when we enter the thread... */
restart:
timeout = wait_event_interruptible_timeout(fepriv->wait_queue,
dvb_frontend_should_wakeup(fe) || kthread_should_stop()
@@ -550,7 +550,7 @@ restart:
if (try_to_freeze())
goto restart;
- if (down_interruptible(&fepriv->sem))
+ if (anon_down_interruptible(&fepriv->sem))
break;
if (fepriv->reinitialise) {
@@ -678,7 +678,7 @@ static void dvb_frontend_stop(struct dvb_frontend *fe)
kthread_stop(fepriv->thread);
- init_MUTEX (&fepriv->sem);
+ anon_semaphore_init(&fepriv->sem);
fepriv->state = FESTATE_IDLE;
/* paranoia check in case a signal arrived */
@@ -747,7 +747,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
if (signal_pending(current))
return -EINTR;
- if (down_interruptible (&fepriv->sem))
+ if (anon_down_interruptible (&fepriv->sem))
return -EINTR;
fepriv->state = FESTATE_IDLE;
@@ -760,7 +760,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
if (IS_ERR(fe_thread)) {
ret = PTR_ERR(fe_thread);
printk("dvb_frontend_start: failed to start kthread (%d)\n", ret);
- up(&fepriv->sem);
+ anon_up(&fepriv->sem);
return ret;
}
fepriv->thread = fe_thread;
@@ -1372,7 +1372,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
cmd == FE_DISEQC_RECV_SLAVE_REPLY))
return -EPERM;
- if (down_interruptible (&fepriv->sem))
+ if (anon_down_interruptible (&fepriv->sem))
return -ERESTARTSYS;
if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
@@ -1382,7 +1382,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
err = dvb_frontend_ioctl_legacy(inode, file, cmd, parg);
}
- up(&fepriv->sem);
+ anon_up(&fepriv->sem);
return err;
}
@@ -1909,7 +1909,7 @@ int dvb_register_frontend(struct dvb_adapter* dvb,
}
fepriv = fe->frontend_priv;
- init_MUTEX (&fepriv->sem);
+ anon_semaphore_init(&fepriv->sem);
init_waitqueue_head (&fepriv->wait_queue);
init_waitqueue_head (&fepriv->events.wait_queue);
mutex_init(&fepriv->events.mtx);
но консоль говорит, что патч идиотский, и отказывается патчить.
/home/kingoff/v4l-dvb-74ad936bcca2/linux/drivers/media/dvb/dvb-core/dvb_frontend.c.patch
patching file dvb_frontend.c
patch: **** malformed patch at line 6: struct dvb_device *dvbdev;
kingoff@UD:~/v4l-dvb-74ad936bcca2/linux/drivers/media/dvb/dvb-core$
Подскажите, как можно исправить проблему? Если нужна еще инфа, спрашивайте, напишу.