Перейти к содержанию
    

sabbatazh

Участник
  • Постов

    13
  • Зарегистрирован

  • Посещение

Весь контент sabbatazh


  1. Спасибо Уважаемые за размышления!!! АМ-детектор получилось собрать на ОУ... но не могу подобрать коэфф. передачи равный 1... и имеется нелинейность ... Как это устранить, а то я ни селен в данном вопросе?!
  2. сопротивление источника (катушки) сигнала 9 Ом... выходной сигнал 230 КГц изменяется от 1 до 5 вольт, частота изменения от 5 до 25 Гц... Обыкновенный диод для моей цели не подойдет из-за возникающей нелинейности на высоких частотах... и используют для устранения нелинейностей ОУ... RC - фильтр не помогает на выходе ОУ (двухполупериодной схемы выпрямления)- искажает полезную информацию из-за завалов от емкости... АМ-Детектор что-то близкое ... но только не могу найти нормальную - рабочую схему...
  3. Здравствуйте уважаемые Знатоки!!! Возникла проблема: Задача состоит в том что бы контролировать изменения уровня амплитуды сигнала 230 КГц с помощью АЦП с частотой дискритизации 100 КГц... что первое на ум пришло это сделать двухполупериодную схему выпрямления на ОУ с емкостью, но сразу отпало из-за емкостного эффекта... вот на очереди детектор... но я не знаю и не встречал ни одной нормально действующей схемы детектора! Прошу Вашей помощи в решении данной проблемы! Спасибо!
  4. Всем огромное СПАСИБО!!! Много полезной информации получил!
  5. Огромное Спасибо Всем кто откликнулся! Я узнал много интересного... Но подходящего не нашел! Значит необходим по следующим параметрам, для проверки изоляции на пробой 2,5 кВ, длиной импульса 40 мкс...
  6. Здравствуйте Уважаемые Знатоки! Помогите в вопросе с поиском схемы источника мощного напряжения на конденсаторах или поделитесь у кого есть?! Суть такова, есть разработанное устройство с использованием свойств параметрического резонанса и встал вопрос о реакции данного устройства на мощный электромагнитный импульс. Начал искать в интернете схему чего то подобного ну или на крайний случай шокера и не нашел, а в измерительной лаборатории много денег хотят на удар 2500В, видел в этой лаборатории кустарное устройство для этих целей собранное на конденсаторах... Помогите с поиском схемы такого устройства, пожалуйста! Спасибо!!!
  7. Драйвер PCI

    Приветствую ВСЕХ!!! Подскажите уважаемые Знатоки, чем воспользоваться для решения вот такой задачи! Написан драйвер под ХР, для платы PCI еще годов так n назад, в nuMega… и встал вопрос переноса его на win7… Кто-то ХР дрова переносил, сталкивался с проблемами и какими подручными средствами лучше всего воспользоваться?! пересмотрел примеры из ДДК и стряпал первый пробник... и пытаюсь прочитать с помощью NTSTATUS MDMAI_IO_READ_Handler(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp, UINT *pdwDataWritten) { NTSTATUS status = STATUS_UNSUCCESSFUL; PCHAR pInputBuffer; PCHAR pOutputBuffer; PCHAR pReturnData; UINT dwDataRead = 0, dwDataWritten = 0; UINT dwDataSize = sizeof(ULONG); USHORT Port; DbgPrint("ReadDirectOutIO Called \r\n"); pInputBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer; pOutputBuffer = NULL; if(Irp->MdlAddress) { pOutputBuffer = (PCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); } if(pInputBuffer && pOutputBuffer) { if(pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength >= dwDataSize) { Port = pInputBuffer[0]; pReturnData = (PCHAR)READ_PORT_UCHAR((PUCHAR)Port); // ну очень смущает!!!!!!!!! /* * We use "RtlCopyMemory" in the kernel instead of memcpy. * RtlCopyMemory *IS* memcpy, however it's best to use the * wrapper in case this changes in the future. */ RtlCopyMemory(pOutputBuffer, pReturnData, dwDataSize); *pdwDataWritten = dwDataSize; status = STATUS_SUCCESS; } else { *pdwDataWritten = dwDataSize; status = STATUS_BUFFER_TOO_SMALL; } } return status; } в результате ни чего и ошибки!( направьте на путь истинный! Спасибо!!!
  8. хм... я так понял... что с ошибкой доступа к памяти не кто не сталкивался и чтением не вернных даных тоже?!
  9. Здравствуйте уважаемы Знатоки!!! Решил обратиться к ВАМ за помощью!!! Столкнулся с проблемой имеется плата с камнем МРС8377, на локальную шину повешена плисина и пытаюсь достучаться в плисину, что бы считать данные. Конструирую модуль и мне если не ошибки валятся так читается разная ерунда, пробовал разные способы (http://electronix.ru/forum/index.php?showtopic=97750), последний вариант, который тоже не работает: #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/ioport.h> #include <linux/delay.h> #include <asm/prom.h> #include <asm-powerpc/io.h> #include <asm-powerpc/qe.h> #define DRIVER_NAME "LocalBus" #define DRIVER_MAJOR 242 static volatile u32 __iomem *p_local_bus; static volatile u32 __iomem *immrbar2; //***here FPGA1 base address is defined on LB (the same as FPGA base address in previous project) #define CFG_FPGA1_BASE 0xF0000000 //***here FPGA2 base address is defined on LB (=FPGA1 base address + 512KB) #define CFG_FPGA2_BASE 0xF0080000 #define IMMRBAR_BASE_ADDR 0xe0000000 #define MBAR_BASE IMMRBAR_BASE_ADDR /* #define IMMRBAR_BASE_ADDR 0xe0000000*/ #define LOCAL_BUS_PHYS_ADDR 0xe0005000 #define LOCAL_BUS_SIZE (64 * 1024 * 1024) #define LBLAWBAR2 0x0030 #define LBLAWAR2 0x0034 #define LBLAWBAR3 0x0038 #define LBLAWAR3 0x003C /* BR - Base Registers */ #define BR0 0x5000 /* Register offset to immr */ #define BR1 0x5008 #define BR2 0x5010 #define BR3 0x5018 #define BR4 0x5020 #define BR5 0x5028 #define BR6 0x5030 #define BR7 0x5038 /* OR - Option Registers */ #define OR0 0x5004 /* Register offset to immr */ #define OR1 0x500C #define OR2 0x5014 #define OR3 0x501C #define OR4 0x5024 #define OR5 0x502C #define OR6 0x5034 #define OR7 0x503C static unsigned int upm_data_array[] = { 0x00ff3c00, 0x00ff3c00, 0x00ff3c00, 0x00ff3c00, //Words 0 to 3 0x00ff3c00, 0x00ff3c00, 0x00ff3c00, 0x00ff7c05, //Words 4 to 7 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 8 to 11 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 12 to 15 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 16 to 19 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 20 to 23 0x00fffc00, 0x00fffc00, 0x00fffc00, 0x00fffc04, //Words 24 to 27 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 28 to 31 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 32 to 35 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 36 to 39 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 40 to 43 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 44 to 47 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 48 to 51 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 52 to 55 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 56 to 59 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01 //Words 60 to 63 }; // MPC83**E UPM setup code on CS3 and CS4. /*----------------------------------------------------------------------------------------------------------------------------------*/ static struct file_operations fops = { .owner= THIS_MODULE, //.read= driver_read, //.open= driver_open, //.release= driver_close, }; static int __init mod_init(void) { int ret = 0; static u32 __iomem *adr1; static u32 __iomem *adr2; u32 size; int i; struct device_node *np; struct resource r; printk("driver_init called\n"); ret = register_chrdev(DRIVER_MAJOR,DRIVER_NAME,&fops); if( ret != 0 ) { printk("register_chrdev failed!\n"); return -EIO; } printk(KERN_NOTICE "Attempting to connect to MPC83XX Local Bus via UPM\n"); if ((np = of_find_node_by_type(NULL, "soc")) == NULL) { printk(KERN_INFO "%s: No SOC node in device tree\n", __FUNCTION__); return -EPERM; } memset(&r, 0, sizeof(r)); if (of_address_to_resource(np, 0, &r)) { printk(KERN_INFO "%s: No SOC reg property in device tree\n", __FUNCTION__); return -EPERM; } request_mem_region(MBAR_BASE, LOCAL_BUS_SIZE, DRIVER_NAME); size = r.end - r.start; printk(KERN_INFO "%s: r.start: 0x%x; r.end: 0x%x; size: %x\n", __FUNCTION__, r.start, r.end, size); immrbar2 = ioremap(MBAR_BASE, LOCAL_BUS_SIZE); printk(KERN_INFO "%s: immrbar2 to: 0x%04x; size: %d\n", __FUNCTION__, immrbar2, LOCAL_BUS_SIZE); /*----------------------------------------------------------------------------------------------*/ adr1 = immrbar2; adr2 = immrbar2; adr1 = immrbar2 + LBLAWBAR2; printk(KERN_INFO "%s: adr1: 0x%x;\n", __FUNCTION__, &adr1); out_be32(&adr1, CFG_FPGA1_BASE); adr2 = immrbar2 + LBLAWAR2; printk(KERN_INFO "%s: adr2: 0x%x;\n", __FUNCTION__, &adr2); out_be32(&adr2, 0x8000000E); udelay(1000); adr1 = immrbar2 + BR2; printk(KERN_INFO "%s: adr1: 0x%x;\n", __FUNCTION__, &adr1); out_be32(&adr1, CFG_FPGA1_BASE | 0x1881); adr2 = immrbar2 + OR2; printk(KERN_INFO "%s: adr2: 0x%x;\n", __FUNCTION__, &adr2); out_be32(&adr2, 0xFFFF8000); eieio(); udelay(1000); adr1 = immrbar2 + LBLAWBAR2; adr2 = immrbar2 + LBLAWAR2; printk(KERN_INFO "%s: LBLAWBAR2: 0x%x; LBLAWAR2: 0x%x;\n", __FUNCTION__, in_be32(&adr1), in_be32(&adr2)); adr1 = immrbar2 + BR2; adr2 = immrbar2 + OR2; printk(KERN_INFO "%s: BR2: 0x%x; OR2: 0x%x;\n", __FUNCTION__, in_be32(&adr1), in_be32(&adr2)); adr1 = 0xe0005070; /*OP set to write to RAM array command MAMR*/ out_be32(&adr1, 0x10000000); adr2 = 0xe0005088; /*UPM Data Register MDR*/ eieio(); udelay(1000); /* Write word to RAM arrays */ for(i=0; i<64; i++) { out_be32(&adr2, upm_data_array[i]); /* UPM Data Register */ eieio(); }; udelay(1); out_be32(&adr1, 0x00000000); /* UPMA Mode Register */ eieio(); udelay(1000); printk(KERN_INFO "%s: MAMR: 0x%x; UPM: 0x%x;\n", __FUNCTION__, in_be32(&adr1), in_be32(&adr2)); printk(KERN_NOTICE "Connected to MPC83XX Local Bus via UPM\n"); //request_mem_region(MBAR_BASE, LOCAL_BUS_SIZE, DRIVER_NAME); //p_local_bus = ioremap_nocache(CFG_FPGA2_BASE, 0x8000); /*----------------------------------------------------------------------------------------------*/ return 0; } /*----------------------------------------------------------------------------------------------------------------------------------*/ static void __exit mod_exit(void) { printk("driver_exit called\n"); iounmap(p_local_bus); iounmap(immrbar2); unregister_chrdev(DRIVER_MAJOR,DRIVER_NAME); } module_init(mod_init); module_exit(mod_exit); MODULE_AUTHOR("none"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("A generic local bus access device"); MODULE_SUPPORTED_DEVICE("none"); и при выводе комментариев получаю не верные данные!(((( или при использовании in_be32(adr1) получаю линуховую ошибку доступа к памяти! Помогите кто уже с таким сталкивался как побороть! Спасибо!
  10. посидев в гугле и с книгами выкрутил модуль, но в нем есть ошибка - не хочет писать и читать или даже не так эти операции проходят не верно при тестировании (test_FPGA1_64regs()), не пойму какая, а можит с инициализациией накрутил (mpc83xx_local_bus_upm_setup()), ПОМОГИТЕ найти: #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/ioport.h> #include <linux/delay.h> #include <asm/prom.h> #include <asm/immap_83xx.h> #include <asm-powerpc/io.h> #include <asm-powerpc/qe.h> #define DRIVER_NAME "LocalBus" #define DRIVER_MAJOR 242 static volatile __be32 __iomem *p_local_bus; static volatile immap_t *immrbar2; //***here FPGA1 base address is defined on LB (the same as FPGA base address in previous project) #define CFG_FPGA1_BASE 0xF0000000 //***here FPGA2 base address is defined on LB (=FPGA1 base address + 512KB) #define CFG_FPGA2_BASE 0xF0080000 #define MBAR_BASE IMMRBAR_BASE_ADDR /* #define IMMRBAR_BASE_ADDR 0xe0000000*/ #define LOCAL_BUS_PHYS_ADDR 0xe0005000 #define LOCAL_BUS_SIZE (64 * 1024 * 1024) static unsigned int upm_data_array[] = { 0x00ff3c00, 0x00ff3c00, 0x00ff3c00, 0x00ff3c00, //Words 0 to 3 0x00ff3c00, 0x00ff3c00, 0x00ff3c00, 0x00ff7c05, //Words 4 to 7 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 8 to 11 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 12 to 15 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 16 to 19 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 20 to 23 0x00fffc00, 0x00fffc00, 0x00fffc00, 0x00fffc04, //Words 24 to 27 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 28 to 31 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 32 to 35 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 36 to 39 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 40 to 43 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 44 to 47 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 48 to 51 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, //Words 52 to 55 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, //Words 56 to 59 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01 //Words 60 to 63 }; // MPC83**E UPM setup code on CS3 and CS4. 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->sysconf.lblaw[3].bar = CFG_FPGA2_BASE; // присвоение физического устройства... /* LBIU local access window base address register */ immrmap->sysconf.lblaw[3].ar = 0x8000000E; //0x80000019; // 64MB /* LBIU local access window attribute register */ //*** Base Adress of the FPGA1; 32bit port; UPMA; "V=>This bank is valid." immrmap->lbus.bank[2].br = CFG_FPGA1_BASE | 0x1881; // 32-bit, no crc check, read-only, UPMA /* Base Register */ //*** 32KB; EHTR(?); EAD(?); <-two attribute bits from old project immrmap->lbus.bank[2].or = 0xFFFF8000; /* Option Register */ //*** Base Adress of the FPGA2; 32bit port; UPMA; "V=>This bank is valid." immrmap->lbus.bank[3].br = CFG_FPGA2_BASE | 0x1881; // 32-bit, no crc check, read-only, UPMA /* Base Register */ //*** 32KB; EHTR(?); EAD(?); <-two attribute bits from old project immrmap->lbus.bank[3].or = 0xFFFF8000; /* Option Register */ immrmap->lbus.mamr = 0x10000000; /* UPMA Mode Register */ eieio(); udelay(1); // Write word to RAM arrays for(i=0; i<64; i++) { immrmap->lbus.mdr = upm_data_array[i]; /* UPM Data Register */ eieio(); } udelay(1); immrmap->lbus.mamr = 0x00000000; /* UPMA Mode Register */ eieio(); udelay(1000); return i; } int test_driver_open(void) { int i; printk("driver_open called\n"); for(i = 0; i < 4; i++) { printk(KERN_INFO "%s: immrmap->sysconf.lblaw[%d].bar %08x\n", __FUNCTION__, i, (unsigned int)immrbar2->sysconf.lblaw[i].bar); //tbdrow printk(KERN_INFO "%s: immrmap->sysconf.lblaw[%d].ar %08x\n", __FUNCTION__, i, (unsigned int)immrbar2->sysconf.lblaw[i].ar); //tbdrow } for(i = 0; i < 8; i++) { printk(KERN_INFO "%s: immrmap->lbus.bank[%d].br %08x\n", __FUNCTION__, i, (unsigned int)immrbar2->lbus.bank[i].br); //tbdrow printk(KERN_INFO "%s: immrmap->lbus.bank[%d].or %08x\n", __FUNCTION__, i, (unsigned int)immrbar2->lbus.bank[i].or); //tbdrow } printk(KERN_INFO "%s: immrmap->lbus.mamr %08x\n", __FUNCTION__, (unsigned int)immrbar2->lbus.mamr); //tbdrow printk(KERN_INFO "%s: immrmap->lbus.lbcr %08x\n", __FUNCTION__, (unsigned int)immrbar2->lbus.lbcr); //tbdrow request_mem_region(LOCAL_BUS_PHYS_ADDR, LOCAL_BUS_SIZE, DRIVER_NAME); /* remap the Local Bus data address */ // p_local_bus = ioremap_nocache(LOCAL_BUS_PHYS_ADDR, LOCAL_BUS_SIZE); p_local_bus = ioremap_nocache(CFG_FPGA1_BASE, 8000); return 0; } int test_driver_close(void) { printk("driver_close called\n"); /* Unmap */ //release_mem_region(LOCAL_BUS_PHYS_ADDR, LOCAL_BUS_SIZE); //iounmap ((void *)p_local_bus); iounmap((void *)p_local_bus); release_mem_region(LOCAL_BUS_PHYS_ADDR, LOCAL_BUS_SIZE); return 0; } /*----------------------------------------------------------------------------------------------------------------------------------*/ void test_FPGA1_64regs(void) { u32 tempFPGA_wr=0, tempFPGA_rd=0; u32 i=0, j=0; volatile __be32 __iomem *_adr; for(j=0; j<64;j++) //*** ADDRESS test { //***write 4 hi-bits of address to FPGA1 (address of FPGA's AddressRegister on LB =0xF000001C) //*(u32*)(CFG_FPGA1_BASE | 0x1C) = (j<<2)&0xF0; _adr = p_local_bus + 0x1C; out_be32(_adr, (j<<2)&0xF0); i = ((j <<2) & 0xC); //*(u32*)(CFG_FPGA1_BASE | i ) = i; _adr = p_local_bus + i; out_be32(_adr, i); //tempFPGA_rd=*(u32*)(CFG_FPGA1_BASE | i ); tempFPGA_rd = in_be32(_adr); eieio(); if( tempFPGA_rd != i ) printk("FPGA1:[%d] WriteCode = %04x ReadCode = %04x \r\n", j, i, tempFPGA_rd); } tempFPGA_wr=0; //additional operator for looking the content of tempFPGA1_rd at the screen iounmap(_adr); } /*----------------------------------------------------------------------------------------------------------------------------------*/ static struct file_operations fops = { .owner= THIS_MODULE, // .read= driver_read, // .open= driver_open, // .release= driver_close, }; static int __init mod_init(void) { int ret = 0; int lburet = -1; struct device_node *np; struct resource r; printk("driver_init called\n"); ret = register_chrdev(DRIVER_MAJOR,DRIVER_NAME,&fops); if( ret != 0 ) { printk("register_chrdev failed!\n"); return -EIO; } printk(KERN_NOTICE "Attempting to connect to MPC83XX Local Bus via UPM\n"); if ((np = of_find_node_by_type(NULL, "soc")) == NULL) { printk(KERN_INFO "%s: No SOC node in device tree\n", __FUNCTION__); return -EPERM; } memset(&r, 0, sizeof(r)); if (of_address_to_resource(np, 0, &r)) { printk(KERN_INFO "%s: No SOC reg property in device tree\n", __FUNCTION__); return -EPERM; } immrbar2 = ioremap_nocache(r.start, sizeof(*immrbar2)); /*------------ MPC83**E UPM setup code on CS3 and CS4 ---------------------------------------*/ lburet = mpc83xx_local_bus_upm_setup(); printk(KERN_INFO "%s: local_bus_upm_ret: %#08x\n", __FUNCTION__, lburet); printk(KERN_NOTICE "Connected to MPC83XX Local Bus via UPM\n"); /*----------------------------------------------------------------------------------------------*/ printk(KERN_NOTICE "TEST...\n"); test_driver_open(); test_FPGA1_64regs();// test_driver_close(); return 0; } static void __exit mod_exit(void) { printk("driver_exit called\n"); iounmap(immrbar2); unregister_chrdev(DRIVER_MAJOR,DRIVER_NAME); } module_init(mod_init); module_exit(mod_exit); MODULE_AUTHOR("none"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("A generic local bus access device"); MODULE_SUPPORTED_DEVICE("none"); Спасибо!
  11. а и столкнулся с такой какой как mmu, что с ней делать? как ее проинициализировать?
  12. Спасибо!!! Делаю драйвер через символьное устройство, нашел подходящий файл структур: 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]; что она делает и что туда писать?
  13. Здравствуйте уважаемые Знатоки! Прошу вашей помощи! только познакомился с продукцией Freecale, а именно с процессором MPC8377. и пытаюсь написать модуль доступа к LocalBus, возникла ошибка: объясняли, что необходимо еще сделать некоторые операции по настройке чипселектов, до меня не дошло! Кто сталкивался с такой штукой подскажите что и как?! Модуль выглядит так: #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"); Спасибо!!!
×
×
  • Создать...