Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 | /* SPDX-License-Identifier: GPL-2.0 */ /* * Helper types to take care of the fact that the DSP card memory * is 16 bits, but aligned on a 32 bit PCI boundary */ static inline u16 get_u16(const u32 __iomem *p) { return (u16)readl(p); } static inline void set_u16(u32 __iomem *p, u16 val) { writel(val, p); } static inline s16 get_s16(const s32 __iomem *p) { return (s16)readl(p); } static inline void set_s16(s32 __iomem *p, s16 val) { writel(val, p); } /* * The raw data is stored in a format which facilitates rapid * processing by the JR3 DSP chip. The raw_channel structure shows the * format for a single channel of data. Each channel takes four, * two-byte words. * * Raw_time is an unsigned integer which shows the value of the JR3 * DSP's internal clock at the time the sample was received. The clock * runs at 1/10 the JR3 DSP cycle time. JR3's slowest DSP runs at 10 * Mhz. At 10 Mhz raw_time would therefore clock at 1 Mhz. * * Raw_data is the raw data received directly from the sensor. The * sensor data stream is capable of representing 16 different * channels. Channel 0 shows the excitation voltage at the sensor. It * is used to regulate the voltage over various cable lengths. * Channels 1-6 contain the coupled force data Fx through Mz. Channel * 7 contains the sensor's calibration data. The use of channels 8-15 * varies with different sensors. */ struct raw_channel { u32 raw_time; s32 raw_data; s32 reserved[2]; }; /* * The force_array structure shows the layout for the decoupled and * filtered force data. */ struct force_array { s32 fx; s32 fy; s32 fz; s32 mx; s32 my; s32 mz; s32 v1; s32 v2; }; /* * The six_axis_array structure shows the layout for the offsets and * the full scales. */ struct six_axis_array { s32 fx; s32 fy; s32 fz; s32 mx; s32 my; s32 mz; }; /* VECT_BITS */ /* * The vect_bits structure shows the layout for indicating * which axes to use in computing the vectors. Each bit signifies * selection of a single axis. The V1x axis bit corresponds to a hex * value of 0x0001 and the V2z bit corresponds to a hex value of * 0x0020. Example: to specify the axes V1x, V1y, V2x, and V2z the * pattern would be 0x002b. Vector 1 defaults to a force vector and * vector 2 defaults to a moment vector. It is possible to change one * or the other so that two force vectors or two moment vectors are * calculated. Setting the changeV1 bit or the changeV2 bit will * change that vector to be the opposite of its default. Therefore to * have two force vectors, set changeV1 to 1. */ /* vect_bits appears to be unused at this time */ enum { fx = 0x0001, fy = 0x0002, fz = 0x0004, mx = 0x0008, my = 0x0010, mz = 0x0020, changeV2 = 0x0040, changeV1 = 0x0080 }; /* WARNING_BITS */ /* * The warning_bits structure shows the bit pattern for the warning * word. The bit fields are shown from bit 0 (lsb) to bit 15 (msb). */ /* XX_NEAR_SET */ /* * The xx_near_sat bits signify that the indicated axis has reached or * exceeded the near saturation value. */ enum { fx_near_sat = 0x0001, fy_near_sat = 0x0002, fz_near_sat = 0x0004, mx_near_sat = 0x0008, my_near_sat = 0x0010, mz_near_sat = 0x0020 }; /* ERROR_BITS */ /* XX_SAT */ /* MEMORY_ERROR */ /* SENSOR_CHANGE */ /* * The error_bits structure shows the bit pattern for the error word. * The bit fields are shown from bit 0 (lsb) to bit 15 (msb). The * xx_sat bits signify that the indicated axis has reached or exceeded * the saturation value. The memory_error bit indicates that a problem * was detected in the on-board RAM during the power-up * initialization. The sensor_change bit indicates that a sensor other * than the one originally plugged in has passed its CRC check. This * bit latches, and must be reset by the user. * */ /* SYSTEM_BUSY */ /* * The system_busy bit indicates that the JR3 DSP is currently busy * and is not calculating force data. This occurs when a new * coordinate transformation, or new sensor full scale is set by the * user. A very fast system using the force data for feedback might * become unstable during the approximately 4 ms needed to accomplish * these calculations. This bit will also become active when a new * sensor is plugged in and the system needs to recalculate the * calibration CRC. */ /* CAL_CRC_BAD */ /* * The cal_crc_bad bit indicates that the calibration CRC has not * calculated to zero. CRC is short for cyclic redundancy code. It is * a method for determining the integrity of messages in data * communication. The calibration data stored inside the sensor is * transmitted to the JR3 DSP along with the sensor data. The * calibration data has a CRC attached to the end of it, to assist in * determining the completeness and integrity of the calibration data * received from the sensor. There are two reasons the CRC may not * have calculated to zero. The first is that all the calibration data * has not yet been received, the second is that the calibration data * has been corrupted. A typical sensor transmits the entire contents * of its calibration matrix over 30 times a second. Therefore, if * this bit is not zero within a couple of seconds after the sensor * has been plugged in, there is a problem with the sensor's * calibration data. */ /* WATCH_DOG */ /* WATCH_DOG2 */ /* * The watch_dog and watch_dog2 bits are sensor, not processor, watch * dog bits. Watch_dog indicates that the sensor data line seems to be * acting correctly, while watch_dog2 indicates that sensor data and * clock are being received. It is possible for watch_dog2 to go off * while watch_dog does not. This would indicate an improper clock * signal, while data is acting correctly. If either watch dog barks, * the sensor data is not being received correctly. */ enum error_bits_t { fx_sat = 0x0001, fy_sat = 0x0002, fz_sat = 0x0004, mx_sat = 0x0008, my_sat = 0x0010, mz_sat = 0x0020, memory_error = 0x0400, sensor_change = 0x0800, system_busy = 0x1000, cal_crc_bad = 0x2000, watch_dog2 = 0x4000, watch_dog = 0x8000 }; /* THRESH_STRUCT */ /* * This structure shows the layout for a single threshold packet inside of a * load envelope. Each load envelope can contain several threshold structures. * 1. data_address contains the address of the data for that threshold. This * includes filtered, unfiltered, raw, rate, counters, error and warning data * 2. threshold is the is the value at which, if data is above or below, the * bits will be set ... (pag.24). * 3. bit_pattern contains the bits that will be set if the threshold value is * met or exceeded. */ struct thresh_struct { s32 data_address; s32 threshold; s32 bit_pattern; }; /* LE_STRUCT */ /* * Layout of a load enveloped packet. Four thresholds are showed ... for more * see manual (pag.25) * 1. latch_bits is a bit pattern that show which bits the user wants to latch. * The latched bits will not be reset once the threshold which set them is * no longer true. In that case the user must reset them using the reset_bit * command. * 2. number_of_xx_thresholds specify how many GE/LE threshold there are. */ struct le_struct { s32 latch_bits; s32 number_of_ge_thresholds; s32 number_of_le_thresholds; struct thresh_struct thresholds[4]; s32 reserved; }; /* LINK_TYPES */ /* * Link types is an enumerated value showing the different possible transform * link types. * 0 - end transform packet * 1 - translate along X axis (TX) * 2 - translate along Y axis (TY) * 3 - translate along Z axis (TZ) * 4 - rotate about X axis (RX) * 5 - rotate about Y axis (RY) * 6 - rotate about Z axis (RZ) * 7 - negate all axes (NEG) */ enum link_types { end_x_form, tx, ty, tz, rx, ry, rz, neg }; /* TRANSFORM */ /* Structure used to describe a transform. */ struct intern_transform { struct { u32 link_type; s32 link_amount; } link[8]; }; /* * JR3 force/torque sensor data definition. For more information see sensor * and hardware manuals. */ struct jr3_sensor { /* * Raw_channels is the area used to store the raw data coming from * the sensor. */ struct raw_channel raw_channels[16]; /* offset 0x0000 */ /* * Copyright is a null terminated ASCII string containing the JR3 * copyright notice. */ u32 copyright[0x0018]; /* offset 0x0040 */ s32 reserved1[0x0008]; /* offset 0x0058 */ /* * Shunts contains the sensor shunt readings. Some JR3 sensors have * the ability to have their gains adjusted. This allows the * hardware full scales to be adjusted to potentially allow * better resolution or dynamic range. For sensors that have * this ability, the gain of each sensor channel is measured at * the time of calibration using a shunt resistor. The shunt * resistor is placed across one arm of the resistor bridge, and * the resulting change in the output of that channel is * measured. This measurement is called the shunt reading, and * is recorded here. If the user has changed the gain of the // * sensor, and made new shunt measurements, those shunt * measurements can be placed here. The JR3 DSP will then scale * the calibration matrix such so that the gains are again * proper for the indicated shunt readings. If shunts is 0, then * the sensor cannot have its gain changed. For details on * changing the sensor gain, and making shunts readings, please * see the sensor manual. To make these values take effect the * user must call either command (5) use transform # (pg. 33) or * command (10) set new full scales (pg. 38). */ struct six_axis_array shunts; /* offset 0x0060 */ s32 reserved2[2]; /* offset 0x0066 */ /* * Default_FS contains the full scale that is used if the user does * not set a full scale. */ struct six_axis_array default_FS; /* offset 0x0068 */ s32 reserved3; /* offset 0x006e */ /* * Load_envelope_num is the load envelope number that is currently * in use. This value is set by the user after one of the load * envelopes has been initialized. */ s32 load_envelope_num; /* offset 0x006f */ /* Min_full_scale is the recommend minimum full scale. */ /* * These values in conjunction with max_full_scale (pg. 9) helps * determine the appropriate value for setting the full scales. The * software allows the user to set the sensor full scale to an * arbitrary value. But setting the full scales has some hazards. If * the full scale is set too low, the data will saturate * prematurely, and dynamic range will be lost. If the full scale is * set too high, then resolution is lost as the data is shifted to * the right and the least significant bits are lost. Therefore the * maximum full scale is the maximum value at which no resolution is * lost, and the minimum full scale is the value at which the data * will not saturate prematurely. These values are calculated * whenever a new coordinate transformation is calculated. It is * possible for the recommended maximum to be less than the * recommended minimum. This comes about primarily when using * coordinate translations. If this is the case, it means that any * full scale selection will be a compromise between dynamic range * and resolution. It is usually recommended to compromise in favor * of resolution which means that the recommend maximum full scale * should be chosen. * * WARNING: Be sure that the full scale is no less than 0.4% of the * recommended minimum full scale. Full scales below this value will * cause erroneous results. */ struct six_axis_array min_full_scale; /* offset 0x0070 */ s32 reserved4; /* offset 0x0076 */ /* * Transform_num is the transform number that is currently in use. * This value is set by the JR3 DSP after the user has used command * (5) use transform # (pg. 33). */ s32 transform_num; /* offset 0x0077 */ /* * Max_full_scale is the recommended maximum full scale. * See min_full_scale (pg. 9) for more details. */ struct six_axis_array max_full_scale; /* offset 0x0078 */ s32 reserved5; /* offset 0x007e */ /* * Peak_address is the address of the data which will be monitored * by the peak routine. This value is set by the user. The peak * routine will monitor any 8 contiguous addresses for peak values. * (ex. to watch filter3 data for peaks, set this value to 0x00a8). */ s32 peak_address; /* offset 0x007f */ /* * Full_scale is the sensor full scales which are currently in use. * Decoupled and filtered data is scaled so that +/- 16384 is equal * to the full scales. The engineering units used are indicated by * the units value discussed on page 16. The full scales for Fx, Fy, * Fz, Mx, My and Mz can be written by the user prior to calling * command (10) set new full scales (pg. 38). The full scales for V1 * and V2 are set whenever the full scales are changed or when the * axes used to calculate the vectors are changed. The full scale of * V1 and V2 will always be equal to the largest full scale of the * axes used for each vector respectively. */ struct force_array full_scale; /* offset 0x0080 */ /* * Offsets contains the sensor offsets. These values are subtracted from * the sensor data to obtain the decoupled data. The offsets are set a * few seconds (< 10) after the calibration data has been received. * They are set so that the output data will be zero. These values * can be written as well as read. The JR3 DSP will use the values * written here within 2 ms of being written. To set future * decoupled data to zero, add these values to the current decoupled * data values and place the sum here. The JR3 DSP will change these * values when a new transform is applied. So if the offsets are * such that FX is 5 and all other values are zero, after rotating * about Z by 90 degrees, FY would be 5 and all others would be zero. */ struct six_axis_array offsets; /* offset 0x0088 */ /* * Offset_num is the number of the offset currently in use. This * value is set by the JR3 DSP after the user has executed the use * offset # command (pg. 34). It can vary between 0 and 15. */ s32 offset_num; /* offset 0x008e */ /* * Vect_axes is a bit map showing which of the axes are being used * in the vector calculations. This value is set by the JR3 DSP * after the user has executed the set vector axes command (pg. 37). */ u32 vect_axes; /* offset 0x008f */ /* * Filter0 is the decoupled, unfiltered data from the JR3 sensor. * This data has had the offsets removed. * * These force_arrays hold the filtered data. The decoupled data is * passed through cascaded low pass filters. Each succeeding filter * has a cutoff frequency of 1/4 of the preceding filter. The cutoff * frequency of filter1 is 1/16 of the sample rate from the sensor. * For a typical sensor with a sample rate of 8 kHz, the cutoff * frequency of filter1 would be 500 Hz. The following filters would * cutoff at 125 Hz, 31.25 Hz, 7.813 Hz, 1.953 Hz and 0.4883 Hz. */ struct force_array filter[7]; /* * offset 0x0090, * offset 0x0098, * offset 0x00a0, * offset 0x00a8, * offset 0x00b0, * offset 0x00b8, * offset 0x00c0 */ /* * Rate_data is the calculated rate data. It is a first derivative * calculation. It is calculated at a frequency specified by the * variable rate_divisor (pg. 12). The data on which the rate is * calculated is specified by the variable rate_address (pg. 12). */ struct force_array rate_data; /* offset 0x00c8 */ /* * Minimum_data & maximum_data are the minimum and maximum (peak) * data values. The JR3 DSP can monitor any 8 contiguous data items * for minimums and maximums at full sensor bandwidth. This area is * only updated at user request. This is done so that the user does * not miss any peaks. To read the data, use either the read peaks * command (pg. 40), or the read and reset peaks command (pg. 39). * The address of the data to watch for peaks is stored in the * variable peak_address (pg. 10). Peak data is lost when executing * a coordinate transformation or a full scale change. Peak data is * also lost when plugging in a new sensor. */ struct force_array minimum_data; /* offset 0x00d0 */ struct force_array maximum_data; /* offset 0x00d8 */ /* * Near_sat_value & sat_value contain the value used to determine if * the raw sensor is saturated. Because of decoupling and offset * removal, it is difficult to tell from the processed data if the * sensor is saturated. These values, in conjunction with the error * and warning words (pg. 14), provide this critical information. * These two values may be set by the host processor. These values * are positive signed values, since the saturation logic uses the * absolute values of the raw data. The near_sat_value defaults to * approximately 80% of the ADC's full scale, which is 26214, while * sat_value defaults to the ADC's full scale: * * sat_value = 32768 - 2^(16 - ADC bits) */ s32 near_sat_value; /* offset 0x00e0 */ s32 sat_value; /* offset 0x00e1 */ /* * Rate_address, rate_divisor & rate_count contain the data used to * control the calculations of the rates. Rate_address is the * address of the data used for the rate calculation. The JR3 DSP * will calculate rates for any 8 contiguous values (ex. to * calculate rates for filter3 data set rate_address to 0x00a8). * Rate_divisor is how often the rate is calculated. If rate_divisor * is 1, the rates are calculated at full sensor bandwidth. If * rate_divisor is 200, rates are calculated every 200 samples. * Rate_divisor can be any value between 1 and 65536. Set * rate_divisor to 0 to calculate rates every 65536 samples. * Rate_count starts at zero and counts until it equals * rate_divisor, at which point the rates are calculated, and * rate_count is reset to 0. When setting a new rate divisor, it is * a good idea to set rate_count to one less than rate divisor. This * will minimize the time necessary to start the rate calculations. */ s32 rate_address; /* offset 0x00e2 */ u32 rate_divisor; /* offset 0x00e3 */ u32 rate_count; /* offset 0x00e4 */ /* * Command_word2 through command_word0 are the locations used to * send commands to the JR3 DSP. Their usage varies with the command * and is detailed later in the Command Definitions section (pg. * 29). In general the user places values into various memory * locations, and then places the command word into command_word0. * The JR3 DSP will process the command and place a 0 into * command_word0 to indicate successful completion. Alternatively * the JR3 DSP will place a negative number into command_word0 to * indicate an error condition. Please note the command locations * are numbered backwards. (I.E. command_word2 comes before * command_word1). */ s32 command_word2; /* offset 0x00e5 */ s32 command_word1; /* offset 0x00e6 */ s32 command_word0; /* offset 0x00e7 */ /* * Count1 through count6 are unsigned counters which are incremented * every time the matching filters are calculated. Filter1 is * calculated at the sensor data bandwidth. So this counter would * increment at 8 kHz for a typical sensor. The rest of the counters * are incremented at 1/4 the interval of the counter immediately * preceding it, so they would count at 2 kHz, 500 Hz, 125 Hz etc. * These counters can be used to wait for data. Each time the * counter changes, the corresponding data set can be sampled, and * this will insure that the user gets each sample, once, and only * once. */ u32 count1; /* offset 0x00e8 */ u32 count2; /* offset 0x00e9 */ u32 count3; /* offset 0x00ea */ u32 count4; /* offset 0x00eb */ u32 count5; /* offset 0x00ec */ u32 count6; /* offset 0x00ed */ /* * Error_count is a running count of data reception errors. If this * counter is changing rapidly, it probably indicates a bad sensor * cable connection or other hardware problem. In most installations * error_count should not change at all. But it is possible in an * extremely noisy environment to experience occasional errors even * without a hardware problem. If the sensor is well grounded, this * is probably unavoidable in these environments. On the occasions * where this counter counts a bad sample, that sample is ignored. */ u32 error_count; /* offset 0x00ee */ /* * Count_x is a counter which is incremented every time the JR3 DSP * searches its job queues and finds nothing to do. It indicates the * amount of idle time the JR3 DSP has available. It can also be * used to determine if the JR3 DSP is alive. See the Performance * Issues section on pg. 49 for more details. */ u32 count_x; /* offset 0x00ef */ /* * Warnings & errors contain the warning and error bits * respectively. The format of these two words is discussed on page * 21 under the headings warnings_bits and error_bits. */ u32 warnings; /* offset 0x00f0 */ u32 errors; /* offset 0x00f1 */ /* * Threshold_bits is a word containing the bits that are set by the * load envelopes. See load_envelopes (pg. 17) and thresh_struct * (pg. 23) for more details. */ s32 threshold_bits; /* offset 0x00f2 */ /* * Last_crc is the value that shows the actual calculated CRC. CRC * is short for cyclic redundancy code. It should be zero. See the * description for cal_crc_bad (pg. 21) for more information. */ s32 last_CRC; /* offset 0x00f3 */ /* * EEProm_ver_no contains the version number of the sensor EEProm. * EEProm version numbers can vary between 0 and 255. * Software_ver_no contains the software version number. Version * 3.02 would be stored as 302. */ s32 eeprom_ver_no; /* offset 0x00f4 */ s32 software_ver_no; /* offset 0x00f5 */ /* * Software_day & software_year are the release date of the software * the JR3 DSP is currently running. Day is the day of the year, * with January 1 being 1, and December 31, being 365 for non leap * years. */ s32 software_day; /* offset 0x00f6 */ s32 software_year; /* offset 0x00f7 */ /* * Serial_no & model_no are the two values which uniquely identify a * sensor. This model number does not directly correspond to the JR3 * model number, but it will provide a unique identifier for * different sensor configurations. */ u32 serial_no; /* offset 0x00f8 */ u32 model_no; /* offset 0x00f9 */ /* * Cal_day & cal_year are the sensor calibration date. Day is the * day of the year, with January 1 being 1, and December 31, being * 366 for leap years. */ s32 cal_day; /* offset 0x00fa */ s32 cal_year; /* offset 0x00fb */ /* * Units is an enumerated read only value defining the engineering * units used in the sensor full scale. The meanings of particular * values are discussed in the section detailing the force_units * structure on page 22. The engineering units are setto customer * specifications during sensor manufacture and cannot be changed by * writing to Units. * * Bits contains the number of bits of resolution of the ADC * currently in use. * * Channels is a bit field showing which channels the current sensor * is capable of sending. If bit 0 is active, this sensor can send * channel 0, if bit 13 is active, this sensor can send channel 13, * etc. This bit can be active, even if the sensor is not currently * sending this channel. Some sensors are configurable as to which * channels to send, and this field only contains information on the * channels available to send, not on the current configuration. To * find which channels are currently being sent, monitor the * Raw_time fields (pg. 19) in the raw_channels array (pg. 7). If * the time is changing periodically, then that channel is being * received. */ u32 units; /* offset 0x00fc */ s32 bits; /* offset 0x00fd */ s32 channels; /* offset 0x00fe */ /* * Thickness specifies the overall thickness of the sensor from * flange to flange. The engineering units for this value are * contained in units (pg. 16). The sensor calibration is relative * to the center of the sensor. This value allows easy coordinate * transformation from the center of the sensor to either flange. */ s32 thickness; /* offset 0x00ff */ /* * Load_envelopes is a table containing the load envelope * descriptions. There are 16 possible load envelope slots in the * table. The slots are on 16 word boundaries and are numbered 0-15. * Each load envelope needs to start at the beginning of a slot but * need not be fully contained in that slot. That is to say that a * single load envelope can be larger than a single slot. The * software has been tested and ran satisfactorily with 50 * thresholds active. A single load envelope this large would take * up 5 of the 16 slots. The load envelope data is laid out in an * order that is most efficient for the JR3 DSP. The structure is * detailed later in the section showing the definition of the * le_struct structure (pg. 23). */ struct le_struct load_envelopes[0x10]; /* offset 0x0100 */ /* * Transforms is a table containing the transform descriptions. * There are 16 possible transform slots in the table. The slots are * on 16 word boundaries and are numbered 0-15. Each transform needs * to start at the beginning of a slot but need not be fully * contained in that slot. That is to say that a single transform * can be larger than a single slot. A transform is 2 * no of links * + 1 words in length. So a single slot can contain a transform * with 7 links. Two slots can contain a transform that is 15 links. * The layout is detailed later in the section showing the * definition of the transform structure (pg. 26). */ struct intern_transform transforms[0x10]; /* offset 0x0200 */ }; struct jr3_block { u32 program_lo[0x4000]; /* 0x00000 - 0x10000 */ struct jr3_sensor sensor; /* 0x10000 - 0x10c00 */ char pad2[0x30000 - 0x00c00]; /* 0x10c00 - 0x40000 */ u32 program_hi[0x8000]; /* 0x40000 - 0x60000 */ u32 reset; /* 0x60000 - 0x60004 */ char pad3[0x20000 - 0x00004]; /* 0x60004 - 0x80000 */ }; |