CFLAGS= -O2 -fno-strict-aliasing -Wall KERNELDIR= /usr/src/linux mydrv.o: mydrv.c $(MAKE) -C $(KERNELDIR) M=$(PWD) obj-m := mydrv.o back: cp mydrv* drv cp Makefile.mydrv drv .PHONY: clean back clean: rm mydrv.o mydrv.ko -------------------------------------------------- /* #ifndef __KERNEL__ #define __KERNEL__ #endif #ifndef MODULE #define MODULE #endif */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/ioport.h> MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("my driver"); /* Standard ISAPnP ports */ #define ADDRESS 0x279 #define WRITE_DATA 0xa79 #define READ_DATA 0x203 /* assigned range port 0x200 to 0x3ff masked by 0x3 */ #define DRV_NAME "mydrv" /* remove ethernet card */ static void my_remove(void) { printk(KERN_INFO "Remove started\n"); /* release_region(ADDRESS, 1); release_region(WRITE_DATA, 1); release_region(READ_DATA, 1); */ printk(KERN_INFO "Remove exit!\n"); } /* probe the card */ static int __init my_probe(void) { // request_region(start, n, name) // for data port, addr port & read port /* if (!request_region(ADDRESS, 1, DRV_NAME)) { printk(KERN_INFO "pnp_addr port not available.\n"); } else { printk(KERN_INFO "pnp_addr port available.\n"); release_region(ADDRESS, 1); } if (!request_region(WRITE_DATA, 1, DRV_NAME)) { printk(KERN_INFO "pnp_write_data port not available.\n"); } else { printk(KERN_INFO "pnp_write_data port available.\n"); release_region(WRITE_DATA, 1); } */ if (!request_region(READ_DATA, 1, DRV_NAME)) { printk(KERN_INFO "pnp_read_data: %#x port not available.\n", READ_DATA); } else { printk(KERN_INFO "pnp_read_data: %#x port available.\n", READ_DATA); release_region(READ_DATA, 1); } // set_wait(0x04); // wait for key // set_wait(0x02); // set_wait(0x04); // CSN = 0 // write_csn(0); // all cards to isolation // wake_csn(0); // write_csn(1); // wake first card // read_conf(); // read config and write to dmesg return 0; } static int __init my_init(void) { printk(KERN_INFO "Initializing...\n"); if(my_probe()) return -1; printk(KERN_INFO "Init finished.\n"); return 0; } static void __exit my_clean(void) { my_remove(); } module_init(my_init); module_exit(my_clean); -------------------------------------------- #dmesg Initializing... BUG: rwlock cpu recursion on CPU#0, insmod/5143, c028c998 [<c0103c89>] dump_stack+0x15/0x17 [<c01b16f9>] rwlock_bug+0x3d/0x45 [<c01b1848>] _raw_write_lock+0x45/0x55 [<c0249181>] _write_lock+0x17/0x1a [<c011aef1>] __request_region+0x46/0x7a [<c8a3402d>] my_probe+0x2d/0x90 [mydrv] [<c8a340a7>] my_init+0x17/0x34 [mydrv] [<c012c9a4>] sys_init_module+0xd6/0x228 [<c01027d9>] syscall_call+0x7/0xb Unable to handle kernel NULL pointer dereference at virtual address 00000207 printing eip: c011ab4d *pde = 00000000 Oops: 0000 [#2] PREEMPT DEBUG_PAGEALLOC Modules linked in: mydrv tsdev parport_pc parport floppy 8250_pnp 8250 s erial_core pcspkr snd_cmipci snd_opl3_lib snd_hwdep snd_mpu401_uart snd_rawmidi snd_seq_device i2c_viapro i2c_core via_agp uhci_hcd usbcore sg sr_mod aic7xxx sc si_transport_spi scsi_mod sis900 mii agpgart snd_pcm_oss snd_pcm snd_timer snd_p age_alloc snd_mixer_oss snd soundcore ide_cd cdrom unix CPU: 0 EIP: 0060:[<c011ab4d>] Not tainted VLI EFLAGS: 00010286 (2.6.15) EIP is at __request_resource+0x14/0x45 eax: 00000203 ebx: c54aad4c ecx: 00000203 edx: c54aad4c esi: d330eaaf edi: 10000000 ebp: c53f7f58 esp: c53f7f4c ds: 007b es: 007b ss: 0068 Process insmod (pid: 5143, threadinfo=c53f6000 task=c5d7bab0) Stack: c54aad4c 00000203 10000000 c53f7f70 c011aefa c330eab0 c8a32700 c53f6000 b7f0de70 c53f7f90 c8a3402d c028c960 00000203 00000001 c8a32093 c8a32099 c53f7f9c c53f7fa0 c8a340a7 c8a32099 b7f0de70 c53f7fb4 c012c9a4 0804b018 Call Trace: [<c0103c6c>] show_stack+0x7e/0x86 [<c0103d77>] show_registers+0xec/0x154 [<c0103f2e>] die+0xdb/0x14c [<c0111a10>] do_page_fault+0x38a/0x4c5 [<c010392f>] error_code+0x4f/0x60 [<c011aefa>] __request_region+0x4f/0x7a [<c8a3402d>] my_probe+0x2d/0x90 [mydrv] [<c8a340a7>] my_init+0x17/0x34 [mydrv] [<c012c9a4>] sys_init_module+0xd6/0x228 [<c01027d9>] syscall_call+0x7/0xb Code: c0 89 c2 75 0d 8b 83 80 00 00 00 c7 40 44 7c c9 28 c0 5b 89 d0 c9 c3 55 89 c1 89 e5 57 56 53 89 d3 8b 7a 04 8b 72 08 39 fe 72 2c <3b> 78 04 72 27 3b 70 08 77 22 8d 50 18 8b 02 85 c0 74 05 39 70 <6>note: insmod[5143] exited with preempt_count 1 Debug: sleeping function called from invalid context at include/linux/rwsem.h:43 in_atomic():1, irqs_disabled():0 [<c0103c89>] dump_stack+0x15/0x17 [<c0113df9>] __might_sleep+0x8f/0x99 [<c0117a90>] exit_mm+0x2f/0x10b [<c01183d8>] do_exit+0x17a/0x395 [<c0103f9f>] do_trap+0x0/0x96 [<c0111a10>] do_page_fault+0x38a/0x4c5 [<c010392f>] error_code+0x4f/0x60 [<c011aefa>] __request_region+0x4f/0x7a [<c8a3402d>] my_probe+0x2d/0x90 [mydrv] [<c8a340a7>] my_init+0x17/0x34 [mydrv] [<c012c9a4>] sys_init_module+0xd6/0x228 [<c01027d9>] syscall_call+0x7/0xb # cat /proc/ioports 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-006f : keyboard 0070-0077 : rtc 0080-008f : dma page reg 00a0-00a1 : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : ide1 01f0-01f7 : ide0 02f8-02ff : serial 0376-0376 : ide1 0378-037a : parport0 037b-037f : parport0 03c0-03df : vga+ 03f0-03f1 : W83877F WDT 03f6-03f6 : ide0 03f8-03ff : serial 0443-0443 : W8387FF WDT 0778-077a : parport0 0cf8-0cff : PCI conf1 5000-5007 : vt596_smbus c000-cfff : PCI Bus #01 c000-c07f : 0000:01:00.0 d000-d00f : 0000:00:07.1 d000-d007 : ide0 d008-d00f : ide1 d400-d41f : 0000:00:07.2 d400-d41f : uhci_hcd d800-d8ff : 0000:00:09.0 d800-d8ff : CMI8738 dc00-dcff : 0000:00:0a.0 e000-e0ff : 0000:00:0b.0 e000-e0ff : sis900 TIA --ArYiX -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/