Прошу вашей помощи!
только познакомился с продукцией Freecale, а именно с процессором MPC8377. и пытаюсь написать модуль доступа к LocalBus, возникла ошибка:
Цитата
Kernle: module startup...
Kernel: Device registered. Major number is 252
Kernel: mmio =0xd1064000
Machine check in kernel mode.
Caused by (from SRR1=49030): Transfer error ack signal
Oops: Machine check, sig: 7 [#1]
MPC837x RDB
Modules linked in: LocalBus(+) [last unloaded: LocalBus]
NIP: d1084118 LR: d10840f8 CTR: c0208f24
REGS: cfba5dc0 TRAP: 0200 Not tainted (2.6.25)
MSR: 00049030 <EE,ME,IR,DR> CR: 24004428 XER: 00000000
TASK = cf8b4810[1442] 'insmod' THREAD: cfba4000
GPR00: 00000001 cfba5e70 cf8b4810 d1084338 00000000 ffffffff c020c048 00004000
GPR08: 00000034 d1064000 00001ca1 d1002500 24004422 10018d88 0000001d d108246c
GPR16: cf9feb80 d1079254 00000000 0000002d 0000002d d1078cad c003dd7c d1064000
GPR24: 0000001f 0000001f d1078dcc d1084960 00000000 d1084960 cfb34800 d1080000
NIP [d1084118] _init_module+0x9c/0x174 [LocalBus]
LR [d10840f8] _init_module+0x7c/0x174 [LocalBus]
Call Trace:
[cfba5e70] [d10840f8] _init_module+0x7c/0x174 [LocalBus] (unreliable)
[cfba5e80] [c003e6f4] sys_init_module+0x130/0x17b8
[cfba5f40] [c000f70c] ret_from_syscall+0x0/0x38
--- Exception: c01 at 0xff6f218
LR = 0x10000950
Instruction dump:
386342e0 7c040378 901f4ae4 4800009d 813f4ae4 2f890000 419e0074 38000001
3c60d108 98090010 38634338 88890001 <48000079> 813f4ae4 3c60d108 38634344
---[ end trace 8933fae98ac0b4a5 ]---
Bus error
Kernel: Device registered. Major number is 252
Kernel: mmio =0xd1064000
Machine check in kernel mode.
Caused by (from SRR1=49030): Transfer error ack signal
Oops: Machine check, sig: 7 [#1]
MPC837x RDB
Modules linked in: LocalBus(+) [last unloaded: LocalBus]
NIP: d1084118 LR: d10840f8 CTR: c0208f24
REGS: cfba5dc0 TRAP: 0200 Not tainted (2.6.25)
MSR: 00049030 <EE,ME,IR,DR> CR: 24004428 XER: 00000000
TASK = cf8b4810[1442] 'insmod' THREAD: cfba4000
GPR00: 00000001 cfba5e70 cf8b4810 d1084338 00000000 ffffffff c020c048 00004000
GPR08: 00000034 d1064000 00001ca1 d1002500 24004422 10018d88 0000001d d108246c
GPR16: cf9feb80 d1079254 00000000 0000002d 0000002d d1078cad c003dd7c d1064000
GPR24: 0000001f 0000001f d1078dcc d1084960 00000000 d1084960 cfb34800 d1080000
NIP [d1084118] _init_module+0x9c/0x174 [LocalBus]
LR [d10840f8] _init_module+0x7c/0x174 [LocalBus]
Call Trace:
[cfba5e70] [d10840f8] _init_module+0x7c/0x174 [LocalBus] (unreliable)
[cfba5e80] [c003e6f4] sys_init_module+0x130/0x17b8
[cfba5f40] [c000f70c] ret_from_syscall+0x0/0x38
--- Exception: c01 at 0xff6f218
LR = 0x10000950
Instruction dump:
386342e0 7c040378 901f4ae4 4800009d 813f4ae4 2f890000 419e0074 38000001
3c60d108 98090010 38634338 88890001 <48000079> 813f4ae4 3c60d108 38634344
---[ end trace 8933fae98ac0b4a5 ]---
Bus error
объясняли, что необходимо еще сделать некоторые операции по настройке чипселектов, до меня не дошло! Кто сталкивался с такой штукой подскажите что и как?! Модуль выглядит так:
Код
#define MODULE
#define __KERNEL__
//#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/stddef.h>
#include <linux/interrupt.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/proc_fs.h>
#include <asm/io.h>
#include <asm/immap_qe.h>
#include <asm/qe.h>
#define DEV_NAME "my_dev"
#define _MBAR_BASE 0xe0000000
#define _CS0_BASE 0xf0000000
#define _CS0_COUNT 0x30
#define _OR0_CFG_VAL 0xFFF00000
#define SUCCESS 0
static int major;
struct file_operations fops;
int _immr_pa;
//unsigned volatile char *mmio;
byte *mmio;
//__be32 __iomem *reg_map;
int _init_module(void )
{
printk("Kernle: module startup...\n");
major = register_chrdev(0, DEV_NAME, &fops);
if (major < 0)
{ // Проверка успешности регистрации
printk("Kernel: Register failed\n");
return major;
};
printk("Kernel: Device registered. Major number is %d\n",major);
if(!request_mem_region(_CS0_BASE/*базовый адрес*/, _CS0_COUNT/*размер*/, DEV_NAME));
{
//тут ругаемся на то, что ядро не дает память
printk("Kernel: request_mem_region");
return 0;
};
//reg_map = ioremap_nocache(_CS0_BASE/*базовый адрес*/, _CS0_COUNT/*размер*/);
mmio = (byte*)ioremap(_CS0_BASE/*базовый адрес*/, _CS0_COUNT/*размер*/);
printk ("Kernel: mmio =0x%p\n", mmio);
if (mmio == NULL)
{
printk ("Kernel: Could not map base registers at beggining of address=0x%X\n", _CS0_BASE);
return -ENOMEM;
};
unsigned int val = 0;
mmio[0x10] = 1; /*пишем по адресу*/
printk("Write 0x%p\n", mmio[0x01]);
val = mmio[0x10];
printk("Read %d\n", val);
iounmap(mmio);
}
void _stop_module()
{
// Снимаем захват памяти
release_mem_region(_CS0_BASE, _CS0_COUNT);
printk("Kernel: release memio ports\n");
// Снимаем регистрацию устройства
if (unregister_chrdev(major, DEV_NAME) < 0){
printk("Kernel: unregister device failed\n");
};
printk("Kernel: device unregistered\n");
printk("Kernel: module3 is dead \n");
return;
}
module_init(_init_module);
module_exit(_stop_module);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver CS");
#define __KERNEL__
//#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/stddef.h>
#include <linux/interrupt.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/proc_fs.h>
#include <asm/io.h>
#include <asm/immap_qe.h>
#include <asm/qe.h>
#define DEV_NAME "my_dev"
#define _MBAR_BASE 0xe0000000
#define _CS0_BASE 0xf0000000
#define _CS0_COUNT 0x30
#define _OR0_CFG_VAL 0xFFF00000
#define SUCCESS 0
static int major;
struct file_operations fops;
int _immr_pa;
//unsigned volatile char *mmio;
byte *mmio;
//__be32 __iomem *reg_map;
int _init_module(void )
{
printk("Kernle: module startup...\n");
major = register_chrdev(0, DEV_NAME, &fops);
if (major < 0)
{ // Проверка успешности регистрации
printk("Kernel: Register failed\n");
return major;
};
printk("Kernel: Device registered. Major number is %d\n",major);
if(!request_mem_region(_CS0_BASE/*базовый адрес*/, _CS0_COUNT/*размер*/, DEV_NAME));
{
//тут ругаемся на то, что ядро не дает память
printk("Kernel: request_mem_region");
return 0;
};
//reg_map = ioremap_nocache(_CS0_BASE/*базовый адрес*/, _CS0_COUNT/*размер*/);
mmio = (byte*)ioremap(_CS0_BASE/*базовый адрес*/, _CS0_COUNT/*размер*/);
printk ("Kernel: mmio =0x%p\n", mmio);
if (mmio == NULL)
{
printk ("Kernel: Could not map base registers at beggining of address=0x%X\n", _CS0_BASE);
return -ENOMEM;
};
unsigned int val = 0;
mmio[0x10] = 1; /*пишем по адресу*/
printk("Write 0x%p\n", mmio[0x01]);
val = mmio[0x10];
printk("Read %d\n", val);
iounmap(mmio);
}
void _stop_module()
{
// Снимаем захват памяти
release_mem_region(_CS0_BASE, _CS0_COUNT);
printk("Kernel: release memio ports\n");
// Снимаем регистрацию устройства
if (unregister_chrdev(major, DEV_NAME) < 0){
printk("Kernel: unregister device failed\n");
};
printk("Kernel: device unregistered\n");
printk("Kernel: module3 is dead \n");
return;
}
module_init(_init_module);
module_exit(_stop_module);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver CS");
Спасибо!!!