19 ssize_t pread (
int __fd,
void *__buf,
size_t __nbytes, off_t __offset);
20 ssize_t pwrite (
int __fd, __const
void *__buf,
size_t __n, off_t offset);
24 #define MAX_VME_MAPPED_SIZE (64*1024*1024)
26 #define MAX_VME_HANDLES 10
31 return addr & PAGE_MASK;
36 if(addr & ~PAGE_MASK == 0) {
39 return (addr & PAGE_MASK) + PAGE_SIZE;
57 unsigned long new_vme_base = 0;
58 unsigned long new_vme_size = 0;
74 unsigned long new_vme_addr_end =
76 new_vme_size = new_vme_addr_end - new_vme_base;
87 new_vme_base = vme_addr;
88 new_vme_size = vme_addr_end - vme_addr;
101 for(
int i = 0;
i < 8;
i++) {
103 sprintf(filename,
"/dev/vme_a32_%d",
i);
104 handle->
fd = open(filename, O_RDWR);
105 if(handle->
fd >= 0) {
112 diag_print(0,
"Unable to open a VME device file\n");
118 munmap((
void *) handle->
base, handle->
size);
123 perror(
"ioctl VMEIMG_SETMAPPING");
129 perror(
"ioctl VMEIMG_SETVMEADDR");
135 perror(
"ioctl VMEIMG_GETVMEADDR");
140 handle->
base = (
volatile unsigned char *)
141 mmap(NULL, new_vme_size, PROT_WRITE | PROT_READ, MAP_SHARED, handle->
fd, 0);
142 if(handle->
base == (
volatile unsigned char *) -1) {
143 perror(
"mmap VME address space");
154 handle->
size = new_vme_size;
169 perror(
"Error unmapping VME:");
171 status = close(handle->
fd);
173 perror(
"Error closing VME:");
175 handle->
used =
false;
180 unsigned long vme_addr,
181 unsigned char *buffer,
187 dma_req.
buf = buffer;
197 return pread(handle->
fd, buffer, size, vme_addr - handle->
vme_base);
202 while(bytes_read < size) {
206 int status = pread(handle->
fd, buffer + bytes_read, size_this_time,
213 if(status < size_this_time) {
225 unsigned char *buffer,
231 dma_req.
buf = buffer;
237 return bytes_written;
241 return pwrite(handle->
fd, buffer, size, vme_addr - handle->
vme_base);
244 int bytes_written = 0;
246 while(bytes_written < size) {
250 int status = pwrite(handle->
fd, buffer + bytes_written, size_this_time,
257 if(status < size_this_time) {
262 return bytes_written;