2 Copyright © 2013-2015, The AROS Development Team. All rights reserved.
5 Desc: VideoCore mailbox support routines
9 #include <hardware/bcm283x.h>
10 #include <hardware/videocore.h>
12 volatile unsigned int *vcmb_read(void *mb
, unsigned int chan
)
14 unsigned int try = 0x2000000;
17 if (chan
<= VCMB_CHAN_MAX
)
21 while ((*((volatile unsigned int *)(mb
+ VCMB_STATUS
)) & VCMB_STATUS_READREADY
) != 0)
23 asm volatile ("mcr p15, #0, %[r], c7, c14, #0" : : [r
] "r" (0) );
30 asm volatile ("mcr p15, #0, %[r], c7, c10, #5" : : [r
] "r" (0) );
32 msg
= *((volatile unsigned int *)(mb
+ VCMB_READ
));
34 asm volatile ("mcr p15, #0, %[r], c7, c10, #5" : : [r
] "r" (0) );
36 if ((msg
& VCMB_CHAN_MASK
) == chan
)
37 return (volatile unsigned int *)(msg
& ~VCMB_CHAN_MASK
);
40 return (volatile unsigned int *)-1;
43 void vcmb_write(void *mb
, unsigned int chan
, void *msg
)
45 if ((((unsigned int)msg
& VCMB_CHAN_MASK
) == 0) && (chan
<= VCMB_CHAN_MAX
))
47 while ((*((volatile unsigned int *)(mb
+ VCMB_STATUS
)) & VCMB_STATUS_WRITEREADY
) != 0)
49 asm volatile ("mcr p15, #0, %[r], c7, c14, #0" : : [r
] "r" (0) );
52 asm volatile ("mcr p15, #0, %[r], c7, c10, #5" : : [r
] "r" (0) );
54 *((volatile unsigned int *)(mb
+ VCMB_WRITE
)) = ((unsigned int)msg
| chan
);