Reading and writing from/to VME device

Didier Kryn kryn at in2p3.fr
Mon Apr 2 19:15:05 EST 2007


    Konstantin, I reproduced your ioctl() problem with the attached 
program. The conclusion is that the only valid size and base parameters 
for A16 are windowSizeL=0x10000 and xlatedAddrL=0. This means the A16 
space can only be mapped as a whole. What you observed with  
xlatedAddrL=0x10100000 is that the ioctl(), gently masks the irrelevant 
high order bits.

    Best regards.
    Didier

Didier Kryn a écrit :
>
>
>     Now, for the ioctl problem, Konstantin, did you try to set 
> xlatedAddrL to zero. The Tsio148, and therefore the driver, enforce 
> alignment on  rather big blocks and maybe misalignment is the cause of 
> the "invalid argument" error. I see no reason not to map the entire 
> A16, A24 or CR/CSR spaces. For the others, of course, you are limited 
> by the size of the cpu's address space.
>
>     I will eventually try to reproduce your ioctl problem next week. 
> Hopping you will solve it before :-) .
>
>     Best regards. Didier
>
> Konstantin Boyanov said:
>> Hi again,
>>
>> Thank you once again for presenting the VME world to me :)
>>
>> >Looks like you're reading something.  Address 0x10100000 is larger than
>> >a 24 bit address.  Perhaps you should be using A32 transfers instead of
>> >A24?
>>
>> No, no, I need to do A16 access, thats the only way to read the 
>> control registers. Form here comes also my confusion - I thought that 
>> when I'm reading CS/CSR register I need to do it in CSR address 
>> space. So no algorithms for geographical location of boards are 
>> needed in my case I guess.
>> Actually the base address of CSR on the board is 0xA000 (10100000 is 
>> the first byte of the address selection in inary, shame on me :( ). 
>> But when I try to configure it with outWinCfgADC.zlatedAddrL = 
>> 0xA000, when I run the programm I get an errno 29 (Invalid argument) 
>> from ioctl(). In fact if I set the xlatedAddrL to some value smaller 
>> that 0x10000 I get this error. Here's my most recent configuration:
>>
>>     outWinCfgADC.windowNbr           = 0;
>>     outWinCfgADC.windowEnable      = 1;
>>     outWinCfgADC.wrPostEnable      = 0;
>>     outWinCfgADC.userAccessType  = VME_SUPER;
>>     outWinCfgADC.dataAccessType  = VME_DATA;
>>     outWinCfgADC.windowSizeL       = 0x10000;
>>     outWinCfgADC.xferProtocol         = VME_SCT;
>>     outWinCfgADC.addrSpace           = VME_A16;
>>     outWinCfgADC.maxDataWidth     = VME_D16;
>>     outWinCfgADC.xlatedAddrL          = 0x10000000;
>>
>> I think that 0x10000 for window size is big enough to encompass the 
>> whole A16 addressable space. With the 0x10000000 xlatedAddr I get no 
>> errors and read the desired registers when I increment this address 
>> to 0x1000A000. But nevertheless it seems strange to me that the 
>> device does not accept xlatedAddr lower that 0x10000. Maybe its due 
>> to the configuration of the VME controller?
>>
>




More information about the Linuxppc-embedded mailing list