реклама на сайте
подробности

 
 
> Модуль обращения к LocalBus, MPC8377
sabbatazh
сообщение Dec 20 2011, 10:34
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 20-12-11
Пользователь №: 68 986



Здравствуйте уважаемые Знатоки!
Прошу вашей помощи!
только познакомился с продукцией 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

объясняли, что необходимо еще сделать некоторые операции по настройке чипселектов, до меня не дошло! Кто сталкивался с такой штукой подскажите что и как?! Модуль выглядит так:
Код
#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");

Спасибо!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sabbatazh
сообщение Dec 23 2011, 10:50
Сообщение #2





Группа: Участник
Сообщений: 13
Регистрация: 20-12-11
Пользователь №: 68 986



Спасибо!!!
Делаю драйвер через символьное устройство, нашел подходящий файл структур: immap_83xx.h, и вот теперь опять вопрос возникнул, как правильно заполнить эти структуры:
пробую так, но чет делаю не то:
Код
// MPC83**E UPM setup code on CS3.

//***here FPGA1  base address is defined   on LB (the same as FPGA  base address in previous project)



     #define CFG_FPGA1_BASE        0xF0000000



#define    MBAR_BASE            IMMRBAR_BASE_ADDR  /* #define IMMRBAR_BASE_ADDR 0xe0000000*/



#define LOCAL_BUS_PHYS_ADDR 0xe0005000

#define LOCAL_BUS_SIZE      (64 * 1024 * 1024)
....

// MPC83**E UPM setup code on CS3.
int mpc83xx_local_bus_upm_setup(void)

{

        unsigned i;

        volatile immap_t *immrmap;    



        printk("mpc83xx_local_bus_upm_setup...\n");

  

        immrmap = immrbar2;

        printk(KERN_INFO "%s: immrmap->sysconf.immrbar  %08x\n", __FUNCTION__, (unsigned int)immrmap->sysconf.immrbar);

        

    //immrmap->sysconf.immrbar = MBAR_BASE;                                                   /* Internal memory map base address register */

        immrmap->sysconf.lblaw[2].bar = CFG_FPGA1_BASE; // присвоение физического устройства... /* LBIU local access window base address register */

        immrmap->sysconf.lblaw[2].ar = 0x8000000E; //0x80000019;  // 64MB               /* LBIU local access window attribute register */

        immrmap->lbus.bank[4].br = LOCAL_BUS_PHYS_ADDR | 0x19c1;  // 32-bit, no crc check, read-only, UPMA /* Base Register */

        immrmap->lbus.bank[4].or = 0xfc000001;  // 64MB, /* Option Register */

        immrmap->lbus.mamr = 0x10000000; /* UPMA Mode Register */

        

        printk(KERN_INFO "%s: immrmap->lbus.mamr  %08x\n", __FUNCTION__, (unsigned int)immrmap->lbus.mamr);

          

        eieio();

        udelay(1);

        

    // Write word to RAM arrays

        for(i=0; i<64; i++)

        {

      

                immrmap->lbus.mdr = upm_data_array;/* UPM Data Register */

                eieio();

        }

        

        udelay(1);

        immrmap->lbus.mamr = 0x0; /* UPMA Mode Register */

    eieio();

        udelay(1000);

        return i;

}

обьясните: в файле immap_83xx.h есть структура :
Код
typedef struct lbus_bank {
    u32 br;            /* Base Register */
    u32 or;            /* Option Register */
} lbus_bank_t;
...
lbus_bank_t bank[8];

что она делает и что туда писать?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 06:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016