summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Kuzminsky <seb@highlab.com>2008-05-26 05:39:24 +0000
committerSebastian Kuzminsky <seb@highlab.com>2008-05-26 05:39:24 +0000
commit99140ef1119cca0a162aeb1ada09a8fcdd5e578b (patch)
treeeb80a24c4bb79e9e2d8257819fd13d846b48e1e5
parent4a03791508450b67555a73499bb8d799bc46ddfd (diff)
downloadlinuxcnc-99140ef1119cca0a162aeb1ada09a8fcdd5e578b.tar.gz
linuxcnc-99140ef1119cca0a162aeb1ada09a8fcdd5e578b.zip
Release 0.2:
* Improved load-time sanity checking. * Improved handling of "zero instances enabled" situations.
-rw-r--r--src/hal/drivers/mesa-hostmot2/ChangeLog7
-rw-r--r--src/hal/drivers/mesa-hostmot2/TODO23
-rw-r--r--src/hal/drivers/mesa-hostmot2/doc/README4
-rw-r--r--src/hal/drivers/mesa-hostmot2/encoder.c33
-rw-r--r--src/hal/drivers/mesa-hostmot2/hostmot2.h2
-rw-r--r--src/hal/drivers/mesa-hostmot2/ioport.c13
-rw-r--r--src/hal/drivers/mesa-hostmot2/pwmgen.c34
-rw-r--r--src/hal/drivers/mesa-hostmot2/stepgen.c33
-rw-r--r--src/hal/drivers/mesa-hostmot2/watchdog.c20
9 files changed, 138 insertions, 31 deletions
diff --git a/src/hal/drivers/mesa-hostmot2/ChangeLog b/src/hal/drivers/mesa-hostmot2/ChangeLog
index 215196cae..cf88744d5 100644
--- a/src/hal/drivers/mesa-hostmot2/ChangeLog
+++ b/src/hal/drivers/mesa-hostmot2/ChangeLog
@@ -1,4 +1,11 @@
+0.2 (released 2008-05-25)
+
+ Improved load-time sanity checking.
+
+ Improved handling of "zero instances enabled" situations.
+
+
0.1 (released 2008-05-13)
Split m7i43_hm2 0.4 into a generic hostmot2 driver and a low-level I/O
diff --git a/src/hal/drivers/mesa-hostmot2/TODO b/src/hal/drivers/mesa-hostmot2/TODO
index fbdf78540..1bc4491b0 100644
--- a/src/hal/drivers/mesa-hostmot2/TODO
+++ b/src/hal/drivers/mesa-hostmot2/TODO
@@ -1,10 +1,31 @@
+misc:
+
+ It's starting to feel like it's ready for some kind of module
+ abstraction... To standardize the semantics and make it easier to
+ think about. Pull out the common code.
+
+
+ add sample configs in configs/mesa-hostmot2
+
+ use env vars to choose board type?
+ http://www.linuxcnc.org/docs/devel/html/man/man1/halcmd.1.html#SUBSTITUTION
+
+
+ where do the firmwares belong?
+
+
+ add support for the 5i22 next
+
+
+
+
bfload
add "bfload reset"
- 5i22 has wrong subdevice ids?
+ 5i22 has wrong subdevice ids? SWP says it works on his 1.5M board
add support for all the other PCI cards
diff --git a/src/hal/drivers/mesa-hostmot2/doc/README b/src/hal/drivers/mesa-hostmot2/doc/README
index 107afb984..d3558b9b4 100644
--- a/src/hal/drivers/mesa-hostmot2/doc/README
+++ b/src/hal/drivers/mesa-hostmot2/doc/README
@@ -1,4 +1,8 @@
+Docs for the Anything I/O boards are available from Mesa at
+<http://www.mesanet.com>.
+
+
The docs for the PLX chipsets used on the PCI Anything I/O boards is
available gratis but not libre from plxtech.com.
diff --git a/src/hal/drivers/mesa-hostmot2/encoder.c b/src/hal/drivers/mesa-hostmot2/encoder.c
index 1a902fe35..03d64b68b 100644
--- a/src/hal/drivers/mesa-hostmot2/encoder.c
+++ b/src/hal/drivers/mesa-hostmot2/encoder.c
@@ -35,10 +35,10 @@ int hm2_encoder_parse_md(hostmot2_t *hm2, int md_index) {
hm2_module_descriptor_t *md = &hm2->md[md_index];
int r;
- if (hm2->config.num_encoders == 0) {
- INFO("num_encoders=0, skipping encoder MD\n");
- return 0;
- }
+
+ //
+ // some standard sanity checks
+ //
if (!hm2_md_is_consistent(hm2, md_index, 2, 5, 4, 0x0003)) {
ERR("inconsistent Module Descriptor!\n");
@@ -47,25 +47,39 @@ int hm2_encoder_parse_md(hostmot2_t *hm2, int md_index) {
if (hm2->encoder.num_instances != 0) {
ERR(
- "Module Descriptor contains duplicate %s (inconsistent firmware), not loading driver\n",
+ "found duplicate Module Descriptor for %s (inconsistent firmware), not loading driver\n",
hm2_get_general_function_name(md->gtag)
);
return -EINVAL;
}
- if (hm2->config.num_encoders == -1) {
- hm2->encoder.num_instances = md->instances;
- } else if (hm2->config.num_encoders > md->instances) {
+ if (hm2->config.num_encoders > md->instances) {
ERR(
"config.num_encoders=%d, but only %d are available, not loading driver\n",
hm2->config.num_encoders,
md->instances
);
- return -1;
+ return -EINVAL;
+ }
+
+ if (hm2->config.num_encoders == 0) {
+ INFO("num_encoders=0, skipping encoder MD\n");
+ return 0;
+ }
+
+
+ //
+ // looks good, start initializing
+ //
+
+
+ if (hm2->config.num_encoders == -1) {
+ hm2->encoder.num_instances = md->instances;
} else {
hm2->encoder.num_instances = hm2->config.num_encoders;
}
+
hm2->encoder.instance = (hm2_encoder_instance_t *)hal_malloc(hm2->encoder.num_instances * sizeof(hm2_encoder_instance_t));
if (hm2->encoder.instance == NULL) {
ERR("out of memory!\n");
@@ -161,6 +175,7 @@ fail0:
void hm2_encoder_force_write(hostmot2_t *hm2) {
+ if (hm2->encoder.num_instances == 0) return;
hm2->llio->write(hm2->llio, hm2->encoder.latch_control_addr, hm2->encoder.control_reg, (hm2->encoder.num_instances * sizeof(u32)));
}
diff --git a/src/hal/drivers/mesa-hostmot2/hostmot2.h b/src/hal/drivers/mesa-hostmot2/hostmot2.h
index 8106f45fe..a206aae2a 100644
--- a/src/hal/drivers/mesa-hostmot2/hostmot2.h
+++ b/src/hal/drivers/mesa-hostmot2/hostmot2.h
@@ -28,7 +28,7 @@
#include "hostmot2-lowlevel.h"
-#define HM2_VERSION "0.1"
+#define HM2_VERSION "0.2"
#define HM2_NAME "hm2"
#define PRINT_NO_LL(level, fmt, args...) rtapi_print_msg(level, HM2_NAME ": " fmt, ## args);
diff --git a/src/hal/drivers/mesa-hostmot2/ioport.c b/src/hal/drivers/mesa-hostmot2/ioport.c
index 3e2a91464..1cec796ea 100644
--- a/src/hal/drivers/mesa-hostmot2/ioport.c
+++ b/src/hal/drivers/mesa-hostmot2/ioport.c
@@ -35,6 +35,11 @@ int hm2_ioport_parse_md(hostmot2_t *hm2, int md_index) {
hm2_module_descriptor_t *md = &hm2->md[md_index];
int i, r;
+
+ //
+ // some standard sanity checks
+ //
+
if (!hm2_md_is_consistent(hm2, md_index, 0, 5, 4, 0x001F)) {
ERR("inconsistent Module Descriptor!\n");
return -EINVAL;
@@ -42,12 +47,17 @@ int hm2_ioport_parse_md(hostmot2_t *hm2, int md_index) {
if (hm2->ioport.num_instances != 0) {
ERR(
- "Module Descriptor contains duplicate %s (inconsistent firmware), not loading driver\n",
+ "found duplicate Module Descriptor for %s (inconsistent firmware), not loading driver\n",
hm2_get_general_function_name(md->gtag)
);
return -EINVAL;
}
+
+ //
+ // special sanity check for io_ports
+ //
+
if (hm2->idrom.io_ports != md->instances) {
ERR(
"IDROM IOPorts is %d but MD IOPort NumInstances is %d, inconsistent firmware, aborting driver load\n",
@@ -59,6 +69,7 @@ int hm2_ioport_parse_md(hostmot2_t *hm2, int md_index) {
hm2->ioport.num_instances = md->instances;
+
hm2->ioport.clock_frequency = md->clock_freq;
hm2->ioport.version = md->version;
diff --git a/src/hal/drivers/mesa-hostmot2/pwmgen.c b/src/hal/drivers/mesa-hostmot2/pwmgen.c
index c1ee4676a..e8c57927d 100644
--- a/src/hal/drivers/mesa-hostmot2/pwmgen.c
+++ b/src/hal/drivers/mesa-hostmot2/pwmgen.c
@@ -34,6 +34,8 @@
void hm2_pwmgen_force_write(hostmot2_t *hm2) {
int i;
+ if (hm2->pwmgen.num_instances == 0) return;
+
for (i = 0; i < hm2->pwmgen.num_instances; i ++) {
hm2->pwmgen.pwm_mode_reg[i] = hm2->pwmgen.instance[i].pwm_width_select;
hm2->pwmgen.pwm_mode_reg[i] |= hm2->pwmgen.instance[i].pwm_mode_select << 2;
@@ -124,10 +126,10 @@ int hm2_pwmgen_parse_md(hostmot2_t *hm2, int md_index) {
hm2_module_descriptor_t *md = &hm2->md[md_index];
int r;
- if (hm2->config.num_pwmgens == 0) {
- INFO("num_pwmgens=0, skipping pwmgen MD\n");
- return 0;
- }
+
+ //
+ // some standard sanity checks
+ //
if (!hm2_md_is_consistent(hm2, md_index, 0, 5, 4, 0x0003)) {
ERR("inconsistent Module Descriptor!\n");
@@ -136,25 +138,39 @@ int hm2_pwmgen_parse_md(hostmot2_t *hm2, int md_index) {
if (hm2->pwmgen.num_instances != 0) {
ERR(
- "Module Descriptor contains duplicate %s (inconsistent firmware), not loading driver\n",
+ "found duplicate Module Descriptor for %s (inconsistent firmware), not loading driver\n",
hm2_get_general_function_name(md->gtag)
);
return -EINVAL;
}
- if (hm2->config.num_pwmgens == -1) {
- hm2->pwmgen.num_instances = md->instances;
- } else if (hm2->config.num_pwmgens > md->instances) {
+ if (hm2->config.num_pwmgens > md->instances) {
ERR(
"config.num_pwmgens=%d, but only %d are available, not loading driver\n",
hm2->config.num_pwmgens,
md->instances
);
- return -1;
+ return -EINVAL;
+ }
+
+ if (hm2->config.num_pwmgens == 0) {
+ INFO("num_pwmgens=0, skipping pwmgen MD\n");
+ return 0;
+ }
+
+
+ //
+ // looks good, start initializing
+ //
+
+
+ if (hm2->config.num_pwmgens == -1) {
+ hm2->pwmgen.num_instances = md->instances;
} else {
hm2->pwmgen.num_instances = hm2->config.num_pwmgens;
}
+
hm2->pwmgen.instance = (hm2_pwmgen_instance_t *)hal_malloc(hm2->pwmgen.num_instances * sizeof(hm2_pwmgen_instance_t));
if (hm2->pwmgen.instance == NULL) {
ERR("out of memory!\n");
diff --git a/src/hal/drivers/mesa-hostmot2/stepgen.c b/src/hal/drivers/mesa-hostmot2/stepgen.c
index 8ee84d253..fe19a5a96 100644
--- a/src/hal/drivers/mesa-hostmot2/stepgen.c
+++ b/src/hal/drivers/mesa-hostmot2/stepgen.c
@@ -231,6 +231,7 @@ static void hm2_stepgen_force_write_pulse_width_time(hostmot2_t *hm2) {
void hm2_stepgen_force_write(hostmot2_t *hm2) {
+ if (hm2->stepgen.num_instances == 0) return;
hm2_stepgen_force_write_mode(hm2);
hm2_stepgen_force_write_dir_setup_time(hm2);
hm2_stepgen_force_write_dir_hold_time(hm2);
@@ -256,10 +257,10 @@ int hm2_stepgen_parse_md(hostmot2_t *hm2, int md_index) {
hm2_module_descriptor_t *md = &hm2->md[md_index];
int r;
- if (hm2->config.num_stepgens == 0) {
- INFO("num_stepgens=0, skipping stepgen MD\n");
- return 0;
- }
+
+ //
+ // some standard sanity checks
+ //
if (!hm2_md_is_consistent(hm2, md_index, 0, 10, 4, 0x01FF)) {
ERR("inconsistent Module Descriptor!\n");
@@ -268,25 +269,39 @@ int hm2_stepgen_parse_md(hostmot2_t *hm2, int md_index) {
if (hm2->stepgen.num_instances != 0) {
ERR(
- "Module Descriptor contains duplicate %s (inconsistent firmware), not loading driver\n",
+ "found duplicate Module Descriptor for %s (inconsistent firmware), not loading driver\n",
hm2_get_general_function_name(md->gtag)
);
return -EINVAL;
}
- if (hm2->config.num_stepgens == -1) {
- hm2->stepgen.num_instances = md->instances;
- } else if (hm2->config.num_stepgens > md->instances) {
+ if (hm2->config.num_stepgens > md->instances) {
ERR(
"config.num_stepgens=%d, but only %d are available, not loading driver\n",
hm2->config.num_stepgens,
md->instances
);
- return -1;
+ return -EINVAL;
+ }
+
+ if (hm2->config.num_stepgens == 0) {
+ INFO("num_stepgens=0, skipping stepgen MD\n");
+ return 0;
+ }
+
+
+ //
+ // looks good, start initializing
+ //
+
+
+ if (hm2->config.num_stepgens == -1) {
+ hm2->stepgen.num_instances = md->instances;
} else {
hm2->stepgen.num_instances = hm2->config.num_stepgens;
}
+
hm2->stepgen.instance = (hm2_stepgen_instance_t *)hal_malloc(hm2->stepgen.num_instances * sizeof(hm2_stepgen_instance_t));
if (hm2->stepgen.instance == NULL) {
ERR("out of memory!\n");
diff --git a/src/hal/drivers/mesa-hostmot2/watchdog.c b/src/hal/drivers/mesa-hostmot2/watchdog.c
index 8cad81c94..6a83ac30d 100644
--- a/src/hal/drivers/mesa-hostmot2/watchdog.c
+++ b/src/hal/drivers/mesa-hostmot2/watchdog.c
@@ -83,6 +83,11 @@ int hm2_watchdog_parse_md(hostmot2_t *hm2, int md_index) {
hm2_module_descriptor_t *md = &hm2->md[md_index];
int r;
+
+ //
+ // some standard sanity checks
+ //
+
if (!hm2_md_is_consistent(hm2, md_index, 0, 3, 4, 0)) {
ERR("inconsistent Module Descriptor!\n");
return -EINVAL;
@@ -90,16 +95,27 @@ int hm2_watchdog_parse_md(hostmot2_t *hm2, int md_index) {
if (hm2->watchdog.num_instances != 0) {
ERR(
- "Module Descriptor contains duplicate %s (inconsistent firmware), not loading driver\n",
+ "found duplicate Module Descriptor for %s (inconsistent firmware), not loading driver\n",
hm2_get_general_function_name(md->gtag)
);
return -EINVAL;
}
+
+ //
+ // special sanity checks for watchdog
+ //
+
if (md->instances != 1) {
WARN("MD declares %d watchdogs! only using the first one...\n", md->instances);
}
+
+ //
+ // looks good, start initializing
+ //
+
+
hm2->watchdog.num_instances = 1;
hm2->watchdog.instance = (hm2_watchdog_instance_t *)hal_malloc(hm2->watchdog.num_instances * sizeof(hm2_watchdog_instance_t));
@@ -251,6 +267,8 @@ void hm2_watchdog_cleanup(hostmot2_t *hm2) {
void hm2_watchdog_force_write(hostmot2_t *hm2) {
u64 tmp;
+ if (hm2->watchdog.num_instances != 1) return;
+
tmp = (hm2->watchdog.instance[0].hal.param.timeout_ns * ((double)hm2->watchdog.clock_frequency / (double)(1000 * 1000 * 1000))) - 1;
if (tmp < 0x80000000) {
hm2->watchdog.timer_reg[0] = tmp;