Buenas pessoal, estou comecando a estudar modulos para o kernel, testei uns "Hello World" e tudo OK, mas estou em um que da um bipe no pc speaker, esse eh o problema. O problema comeca na compilacao, uns 10 "warnings", depois quando vou inseri-lo no kernel do linux, que retorna o seguinte:
alan@alan-note:~/modulos/TutorialRafael/beep$ sudo insmod beep-speaker.ko
insmod: error inserting 'beep-speaker.ko': -1 Unknown symbol in module
alan@alan-note:~/modulos/TutorialRafael/beep$
Entao digito dmesg e lah no final tem o seguinte:
[ 5699.644987] beep_speaker: Unknown symbol cli
[ 5699.645046] beep_speaker: Unknown symbol restore_flags
[ 5699.645097] beep_speaker: Unknown symbol save_flags
O arquivo Makefile utilizado eh o seguinte:
obj-m += beep-speaker.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
O fonte eh beep-speaker.c (retirado de kernelnewbies, modificado por mim =P):
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/system.h> //add por causa das 3 funcoes: cli(), save_flags() e restore_flags()
#include <linux/delay.h>
#include <asm/string.h>
#include <asm/io.h>
#define SPEAKER_PORT 0x61
#define PORT 0xFC
#define HZ_MN1 0xff
#define HZ_MN2 0x42
#define __bad_udelay() "wrong"
static void kd_nosound(unsigned long ignored)
{
/* acesssando port space */
/* outb - saida em 8-bit */
/* inb_p - entrada em 8-bit */
outb(inb_p(SPEAKER_PORT) & PORT, SPEAKER_PORT);
return;
}
static void kd_mksound(unsigned int hz, unsigned int ticks)
{
static struct timer_list sound_timer = {
function: kd_nosound
};
unsigned int count = 0;
unsigned long flags;
if (hz > 20 && hz < 32767)
count = 1193180 / hz;
save_flags(flags); // salva as flags do processador para poder modifica-la
cli(); // desativa as interrupcoes
del_timer(&sound_timer);
if (count)
{
outb_p(inb_p(SPEAKER_PORT) | 3, SPEAKER_PORT);
outb_p(0xB6, 0x43);
/* selecionar HZ desejado */
outb_p(count & HZ_MN1, HZ_MN2);
outb((count >> 8) & HZ_MN1, HZ_MN2);
if (ticks)
{
sound_timer.expires = jiffies+ticks;
add_timer(&sound_timer);
}
}
else
kd_nosound(0);
restore_flags(flags); // restaura as flags do processador para poder modifica-la
return;
}
int init_module(void)
{
printk(KERN_INFO "PC Speaker inicializando! \n");
kd_mksound(494,120);
mdelay(200);
kd_mksound(1,140);
mdelay(100);
kd_mksound(330,120);
mdelay(200);
kd_mksound(1,120);
mdelay(100);
kd_mksound(415,120);
mdelay(200);
kd_mksound(1,120);
mdelay(100);
kd_mksound(494,120);
mdelay(200);
kd_mksound(1,120);
mdelay(100);
kd_mksound(0,0);
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "PC Speaker sendo finalizado! \n");[color=black][/color]
}
EXPORT_NO_SYMBOLS;
MODULE_AUTHOR("Guilherme Polo");
MODULE_LICENSE("GPL");
Alguem pode me ajudar? Não sei oq fazer para contornar este problema. Soh para constar, utilizo o kernel 2.6.22-14-generic.
[/color][/color]