EP405 Kernel module problem
Toni Van Remortel
t.vanremortel at ha.be
Mon Oct 13 23:37:07 EST 2003
Hi all,
I try to run the next module on my systems, but I get a kernel Oops.
Module code:
#include <linux/module.h>
#include <linux/version.h>
#include <rtai.h>
#include <rtai_sched.h>
#define DCRN_CPC0_CR0 (0xb1)
#define GPIO0_REG_BASE (0xEF600700)
#define GPIO0_OR (0x00)
#define GPIO0_TCR (0x04)
#define GPIO0_ODR (0x18)
#define GPIO0_IR (0x1C)
RT_TASK task;
u8* gpio_baseptr;
#define PERIOD 1000
void rt_control(int data) {
// Output a square wave on GPIO0
u32 cnt = 0x00000001;
for(;;) {
// Output the cnt value
writeb( (u32)cnt , (u32)gpio_baseptr+GPIO0_OR);
// Invert the cnt bit
cnt ^= 0x00000001;
// Wait for the next period
rt_task_wait_period();
};
};
int init_module(void) {
u32 tmp32;
u32* gpio_base_addr;
printk("PPC405GP on EP405 rt_mod\n");
// read register
tmp32 = mfdcr( DCRN_CPC0_CR0 );
// bit TRE in CPC0_CR0 = 0 ==> GPIO1-9 enabled
tmp32 &= ~0x08000000;
// write register
mtdcr( DCRN_CPC0_CR0, tmp32 );
// remap
gpio_base_addr=(u32*)ioremap(GPIO0_REG_BASE,0x20);
// set GPIO outputs at a safe default value (TBD)
writel( 0x00000000, (u32)gpio_baseptr+GPIO0_OR );
// configure GPIO outputs 1..3 as not tri-state
writel( 0xffffffff, (u32)gpio_baseptr+GPIO0_TCR );
// configure GPIO outputs 1..3 as not open-drain
writel( 0x00000000, (u32)gpio_baseptr+GPIO0_ODR );
// set RTAI timer mode to 'one shot'
rt_set_oneshot_mode();
// Start the timer
start_rt_timer(0);
// Initialise the task
rt_task_init(&task, rt_control, 0, 1000, 10, 0, 0);
// Make the task periodic
rt_task_make_periodic(&task,rt_get_time()+10*PERIOD,PERIOD);
return 0;
}
void cleanup_module(void) {
// unmap when module is unloaded
iounmap(gpio_baseptr);
// Stop the RTAI timer
stop_rt_timer();
// Remove the task
rt_task_delete(&task);
};
Kernel message:
# insmod ./rtai_mod.o
Using ./rtai_modOops: kernel access of bad area, sig: 11
NIP: C000FA9C XER: 00000000 LR: C001620C SP: C0B91ED0 REGS: c0b91e20
TRAP: 0800d
MSR: 00009030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
DEAR: 00000000, ESR: 00000000
TASK = c0b90000[34] 'exe' Last syscall: 166
last math 00000000 last altivec 00000000
PLB0: bear= 0xfd189df5 acr= 0x00000000 besr= 0x00000000
PLB0 to OPB: bear= 0x01524021 besr0= 0x00000000 besr1= 0x00000000
GPR00: 7FFFFF90 C0B91ED0 C0B90000 00000000 FFFFFFFF 00000400 7FFFB9E8
7FFFB9E8
GPR08: C01B5200 00000001 C00166CC 0000000E 44000088 100668A8 00000000
00000000
GPR16: 00000000 00000000 00000000 00000000 00009032 00B91F40 7FFFB9E8
C201F000
GPR24: 00000000 00000390 10071B68 00000070 10071BD8 10071B68 C2025504
FFFFFFFE
Call backtrace:
10071B68 C00166E0 C000479C 10012A38 100145BC 1003AF0C 1003AB44
0FECAD14 00000000
.o
SIGSEGV
The needed RTAI modules are loaded (rtai, rtai_fifos, rtai_sched). It's
not an RTAI problem, because this module is based on a working example
for Coldfire.
Probably I use wrong registers somewhere, but I don't see a mistake yet.
PS: I gonna use 3 GPIO's, but now it's just a test.
Some suggestions?
--
Toni Van Remortel
Wetenschappelijk Medewerker - D-science lab
Real time Linux for embedded systems: http://linemb.d-sciencelab.com
Tel: +32 3 205 61 72 - Fax: +32 3 205 61 95
E-mail: t.vanremortel at ha.be
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-embedded
mailing list