16 #include <sys/neutrino.h> 17 #include <sys/iofunc.h> 18 #include <sys/dispatch.h> 22 #define min(a, b) ((a) < (b) ? (a) : (b)) 24 int io_read(resmgr_context_t * ctp, io_read_t * msg, RESMGR_OCB_T * ocb);
25 static char *
buffer = (
char *)
"Hello world\n";
29 #include "QNX101/jr3pci3.idm" 31 #define VENDORID 0x1762 34 #define DEVICEID 0x3112 37 #define Jr3ResetAddr 0x18000 38 #define Jr3NoAddrMask 0x40000 39 #define Jr3DmAddrMask 0x6000 43 #define ToJr3PciAddrH(addr) (((int)(addr) << 2) + Jr3BaseAddressH) 44 #define ToJr3PciAddrL(addr) (((int)(addr) << 2) + Jr3BaseAddressL) 47 #define ReadJr3Pm(addr) (*(uint16_t volatile *)(ToJr3PciAddrH((addr))) << 8 |\ 48 *(uint8_t volatile *)(ToJr3PciAddrL((addr)))) 50 #define WriteJr3Pm2(addr,data,data2) (*(int volatile *)ToJr3PciAddrH((addr)) = (int)(data));(*(int volatile *)ToJr3PciAddrL((addr)) = (int)(data2)) 52 #define WriteJr3Pm(addr,data) WriteJr3Pm2((addr),(data) >> 8, (data)) 55 #define ReadJr3Dm(addr) (*(uint16_t volatile *)(ToJr3PciAddrH((addr)))) 56 #define WriteJr3Dm(addr,data) *(int volatile *)(ToJr3PciAddrH((addr))) = (int)(data) 59 #define ReadJr3(addr) (ReadJr3Dm((addr) | Jr3DmAddrMask)) 60 #define WriteJr3(addr,data) WriteJr3Dm((addr) | Jr3DmAddrMask,data) 168 { (
char *)
"pound, inch*pound, inch*1000",
170 (
char *)
"Newton, Newton*meter*10, mm*10",
171 (
char *)
"kilogram-force*10, kilogram-Force*cm, mm*10",
172 (
char *)
"kilopound, kiloinch*pound, inch*1000" };
224 char copyright[0x18 * 4];
225 int16_t reserved1[0x08 * 2];
227 int16_t reserved2[2];
329 int download(
unsigned int base0,
unsigned int base1) {
330 printf(
"Download %x %x\n", base0, base1);
337 Jr3BaseAddressH = base0;
338 Jr3BaseAddressL = base1;
341 count = dsp[index++];
344 while (count != 0xffff) {
361 printf(
"data addr: %4.4x out: %4.4x in: %4.4x\n", addr,
370 data2 = dsp[index++];
375 if (((data << 8) | (data2 & 0xff))
382 count = dsp[index++];
390 struct tm t1, *soft_day, *cal_day;
393 t1.tm_sec = t1.tm_min = t1.tm_hour = 0;
399 soft_day = localtime(&t2);
400 t1.tm_sec = t1.tm_min = t1.tm_hour = 0;
406 cal_day = localtime(&t2);
407 snprintf(msg, 128,
"rom # %d, soft # %d, %d/%d/%d\n" 408 "serial # %d, model # %d, cal day %d/%d/%d\n" 409 "%s, %d bits, %d ch\n" 410 "(C) %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n\n",
412 soft_day->tm_mon + 1, soft_day->tm_year + 1900, data->
serial_no,
413 data->
model_no, cal_day->tm_mday, cal_day->tm_mon + 1,
449 num = type - _IO_MAX;
453 float tmp[12] = { -1.0 * (float) data_0->
filter0.
fx 454 / (
float) data_0->full_scale.fx, -1.0
455 * (float) data_0->filter0.fy / (
float) data_0->full_scale.fy,
456 -1.0 * (float) data_0->filter0.fz
457 / (
float) data_0->full_scale.fz, -1.0
458 * (float) data_0->filter0.mx
459 / (
float) data_0->full_scale.mx * 0.1,
460 -1.0 * (float) data_0->filter0.my
461 / (
float) data_0->full_scale.my * 0.1, -1.0
462 * (float) data_0->filter0.mz
463 / (
float) data_0->full_scale.mz * 0.1, -1.0
464 * (float) data_1->filter0.fx
465 / (
float) data_1->full_scale.fx, -1.0
466 * (float) data_1->filter0.fy
467 / (
float) data_1->full_scale.fy, -1.0
468 * (float) data_1->filter0.fz
469 / (
float) data_1->full_scale.fz, -1.0
470 * (float) data_1->filter0.mx
471 / (
float) data_1->full_scale.mx * 0.1, -1.0
472 * (float) data_1->filter0.my
473 / (
float) data_1->full_scale.my * 0.1, -1.0
474 * (float) data_1->filter0.mz
475 / (
float) data_1->full_scale.mz * 0.1 };
476 memcpy(msg_reply, tmp,
sizeof(
float) * 12);
480 data_0->offsets.fx += data_0->filter0.fx;
481 data_0->offsets.fy += data_0->filter0.fy;
482 data_0->offsets.fz += data_0->filter0.fz;
483 data_0->offsets.mx += data_0->filter0.mx;
484 data_0->offsets.my += data_0->filter0.my;
485 data_0->offsets.mz += data_0->filter0.mz;
486 data_1->offsets.fx += data_1->filter0.fx;
487 data_1->offsets.fy += data_1->filter0.fy;
488 data_1->offsets.fz += data_1->filter0.fz;
489 data_1->offsets.mx += data_1->filter0.mx;
490 data_1->offsets.my += data_1->filter0.my;
491 data_1->offsets.mz += data_1->filter0.mz;
502 MsgReply(ctp->rcvid, EOK, msg_reply, 256);
506 int main(
int argc,
char **argv) {
507 resmgr_attr_t resmgr_attr;
508 message_attr_t message_attr;
510 dispatch_context_t *ctp, *ctp_ret;
511 int resmgr_id, message_id;
514 dpp = dispatch_create();
516 fprintf(
stderr,
"dispatch_create() failed: %s\n", strerror(errno));
520 memset(&resmgr_attr, 0,
sizeof(resmgr_attr));
521 resmgr_attr.nparts_max = 1;
522 resmgr_attr.msg_max_size = 2048;
525 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &
ConnectFuncs, _RESMGR_IO_NFUNCS,
531 iofunc_attr_init(&
IoFuncAttr, S_IFNAM | 0666, 0, 0);
534 resmgr_id = resmgr_attach(dpp, &resmgr_attr,
"/dev/jr3q", _FTYPE_ANY, 0,
536 if (resmgr_id == -1) {
537 fprintf(
stderr,
"resmgr_attach() failed: %s\n", strerror(errno));
542 unsigned int flags = 0;
543 unsigned bus,
function,
index = 0;
544 unsigned devid, venid;
546 unsigned lastbus,
version, hardware;
547 unsigned int address0;
552 result = pci_present(&lastbus, &version, &hardware);
554 printf(
"PCI BIOS not present!\n");
558 result = pci_find_device(devid, venid, index, &bus, &
function);
559 printf(
"result PCI %d\n", result);
560 printf(
"bus %d\n", bus);
561 printf(
"function %d\n",
function);
562 pci_read_config_bus(bus,
function, 0x10, 1,
sizeof(
unsigned int), bufptr);
564 address0 = *(
unsigned int *) bufptr;
566 printf(
"Board addr 0x%x\n", *(
unsigned int *)
buffer);
569 PROT_READ | PROT_WRITE | PROT_NOCACHE, 0, address0);
571 PROT_READ | PROT_WRITE | PROT_NOCACHE, 0, address0 +
Jr3NoAddrMask);
572 Jr3BaseAddressH = (
volatile uint32_t) mmap_device_memory(NULL, 0x100000,
573 PROT_READ | PROT_WRITE | PROT_NOCACHE, 0, address0);
580 PROT_READ | PROT_WRITE | PROT_NOCACHE, 0, address0 + 0x80000);
582 PROT_READ | PROT_WRITE | PROT_NOCACHE, 0, address0 + 0x80000 +
605 memset(&message_attr, 0,
sizeof(message_attr));
606 message_attr.nparts_max = 1;
607 message_attr.msg_max_size = 4096;
610 message_id = message_attach(dpp, &message_attr, _IO_MAX + 1, _IO_MAX + 10,
612 if (message_id == -1) {
613 fprintf(
stderr,
"message_attach() failed: %s\n", strerror(errno));
618 ctp = dispatch_context_alloc(dpp);
620 fprintf(
stderr,
"dispatch_context_alloc() failed: %s\n",
627 ctp_ret = dispatch_block(ctp);
629 dispatch_handler(ctp);
631 fprintf(
stderr,
"dispatch_block() failed: %s\n", strerror(errno));
639 int io_read(resmgr_context_t * ctp, io_read_t * msg, RESMGR_OCB_T * ocb) {
645 if ((status = iofunc_read_verify(ctp, msg, ocb, NULL)) != EOK)
648 if ((msg->i.xtype & _IO_XTYPE_MASK) != _IO_XTYPE_NONE)
658 nleft = ocb->attr->nbytes - ocb->offset;
659 nbytes =
min(msg->i.nbytes, nleft);
663 SETIOV(ctp->iov,
buffer + ocb->offset, nbytes);
666 _IO_SET_READ_NBYTES(ctp, nbytes);
673 ocb->offset += nbytes;
680 _IO_SET_READ_NBYTES(ctp, 0);
686 if (msg->i.nbytes > 0)
687 ocb->attr->flags |= IOFUNC_ATTR_ATIME;
689 return (_RESMGR_NPARTS(nparts));
694 struct timeval tv, tv1;
699 gettimeofday(&tv, NULL);
700 }
while (tv.tv_sec - tv1.tv_sec < 3);
six_axis_array default_FS
volatile uint32_t Jr3BaseAddressH
int16_t number_of_ge_thresholds
static resmgr_connect_funcs_t ConnectFuncs
static iofunc_attr_t IoFuncAttr
#define WriteJr3Dm(addr, data)
volatile uint32_t Jr3BaseAddress1L
six_axis_array max_full_scale
int16_t number_of_le_thresholds
static resmgr_io_funcs_t IoFuncs
int gettimeofday(struct timeval *tv, struct timezone *tz)
int message_callback(message_context_t *ctp, int type, unsigned flags, void *handle)
int main(int argc, char **argv)
volatile uint32_t Jr3BaseAddress0L
volatile uint32_t Jr3BaseAddressL
int16_t load_envelope_num
volatile uint32_t Jr3BaseAddress0H
int io_read(resmgr_context_t *ctp, io_read_t *msg, RESMGR_OCB_T *ocb)
#define WriteJr3Pm2(addr, data, data2)
void get_force_sensor_info(force_sensor_data *data, char *msg)
int download(unsigned int base0, unsigned int base1)
six_axis_array min_full_scale
unsigned long MappedAddress
volatile uint32_t Jr3BaseAddress1H