mmap تراكب VME حافلة في الذاكرة الفضاء المستخدم على PCI؟

StackOverflow https://stackoverflow.com/questions/1212874

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن تعيين مساحة العنوان VME من خلال ناقل PCI في الفضاء المستخدم حتى أتمكن من أداء القراءة العادية / يكتب على الذاكرة. وقد فعلت ذلك مع جهاز PCI آخر من هذا القبيل: -

unsigned long *mapArea(unsigned int barAddr, unsigned int mapSize, int *fd)
{
    unsigned long *mem;

    *fd = open("/dev/mem", O_RDWR);
    if ( *fd<0 ) {
       printf("Cannot open /dev/vme_mem\n");
    exit(-1);
}

unsigned long *mem = (unsigned long*) mmap ( 0, mapSize, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, *fd,  barAddr); 
if ( (mem == NULL) || (mem == (unsigned long*)-1) ) {
    printf ( "Cannot map memory, error is %s\n", strerror(errno) );
    exit(-1);
    }

    return mem;
}

volatile unsigned long *bar = (volatile unsigned long *)mapArea(barAddr, mapSize, &fd);

وبعد ذلك "شريط" يمكن أن تستخدم عادة للقراءة / يكتب.

وذلك لVME، مع وجود رقاقة تندرا الكون II PCI-VME الجسر: -

وأود أن فتح "/ ديف / vme_m0" أين يمكنني تعيين BAR لي من؟ و-vv lspci: "منطقة 1: الذاكرة في 80020000"

وأيضا يتم إجراء مقاصة بين عناوين داخل BUS VME التي كتبها 0x20000000، فكيف يفعل ذلك WRT العمل الوصول إلى / رسم الخرائط ذلك؟!

و(عن طريق لينكس 2.6.18-128.el5 # 1 SMP) (هل تحتاج إلى علامة جديدة "VME"!)

هل كانت مفيدة؟

المحلول

وأين / ديف / vme_m0 تأتي من وماذا تمثل؟ ومن الصعب معرفة ما فتح والوصول إلى انها لن تفعل دون أن يعرفوا أكثر.

وأنت بحاجة الى ان ننظر في دليل رقاقة الجسر لمعرفة كيفية قراءة / الكتابة إلى منطقة 1 سوف تترجم إلى القراءة / الكتابة على حافلة VME. يجب أن يكون رقاقة جسر مجموعة من السجلات التي تحدد PCI - ترجمة> عنوان VME. ان عنوان VME الناتجة عن الوصول 0x80020000 تعتمد على عنوان VME المحددة في واحدة من تلك السجلات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top