Hi Fu,

Luotao Fu wrote:
> Hi Wolfgang,
> 
> On Fri, Nov 27, 2009 at 11:14:57AM +0100, Wolfgang Grandegger wrote:
> ...
>> I don't want to invite people playing with the sample-point. To be
>> clear, sample_point==0 will not be ignored. It means using CIA
>> recommended sample points for the specified bit-rate.
>>
> 
> The function is now splitte up in a simple set_bitrate and a expert
> set_bitrate_samplepoint as you suggested. I Also changed name prefix
> to can_ in API and renamed the library to libsocketcan. Hence the lib
> is now available at:
> git://git.pengutronix.de/git/tools/libsocketcan.git
> The old URL still exists as a link for convenience though.
> 
> I pinned the lib version to 0.0.4 and the updated canutils to 4.0.2.
> There're tarballs for ready to use source on our ftp server.

I finally had a closer look. I have attached two patches showing my
enhancements and fixes. Futhermore, I would change the name "mode" to
"ctrlmode". "mode" is reserved for CAN operation modes like start, stop,
or sleep. It would also be nice to allow:

$ canconfig can0 bitrate 125000 restart-ms 100 start

> have a nice weekend

Same to you.

Wolfgang.
Add can_get_bittiming_const()

Signed-off-by: Wolfgang Grandegger <[email protected]>
diff --git a/include/libsocketcan.h b/include/libsocketcan.h
index a92d33b..afe15f6 100644
--- a/include/libsocketcan.h
+++ b/include/libsocketcan.h
@@ -38,5 +38,6 @@ int can_get_bittiming(const char *name, struct can_bittiming *bt);
 int can_get_ctrlmode(const char *name, struct can_ctrlmode *cm);
 int can_get_state(const char *name, int *state);
 int can_get_clock(const char *name, struct can_clock *clock);
+int can_get_bittiming_const(const char *name, struct can_bittiming_const *btc);
 
 #endif
diff --git a/src/libsocketcan.c b/src/libsocketcan.c
index 3c02d3d..07cc10f 100644
--- a/src/libsocketcan.c
+++ b/src/libsocketcan.c
@@ -47,6 +47,7 @@
 #define GET_BITTIMING 3
 #define GET_CTRLMODE 4
 #define GET_CLOCK 5
+#define GET_BITTIMING_CONST 6
 
 struct get_req {
 	struct nlmsghdr n;
@@ -389,6 +390,16 @@ static int do_get_nl_link(int fd, __u8 acquire, const char *name, void *res)
 					"no clock parameter data found\n");
 
 			break;
+		case GET_BITTIMING_CONST:
+			if (can_attr[IFLA_CAN_BITTIMING_CONST]) {
+				memcpy(res,
+				       RTA_DATA(can_attr[IFLA_CAN_BITTIMING_CONST]),
+				       sizeof(struct can_bittiming_const));
+				ret = 0;
+			} else
+				fprintf(stderr, "no bittiming_const data found\n");
+
+			break;
 		default:
 			fprintf(stderr, "unknown acquire mode\n");
 		}
@@ -644,3 +655,9 @@ int can_get_clock(const char *name, struct can_clock *clock)
 {
 	return get_link(name, GET_CLOCK, clock);
 }
+
+int can_get_bittiming_const(const char *name, struct can_bittiming_const *btc)
+{
+	return get_link(name, GET_BITTIMING_CONST, btc);
+}
+
Add can_get_bittiming_const() and further fixes and improvements

- s/can_modes/can_states/
- Use proper names for CAN error states
- Use "-" as name seperator for input and output consequently
- Add some more useful output to cmd_show_interface()

Signed-off-by: Wolfgang Grandegger <[email protected]>

diff --git a/src/canconfig.c b/src/canconfig.c
index d8b9167..0139a1c 100644
--- a/src/canconfig.c
+++ b/src/canconfig.c
@@ -37,11 +37,11 @@
 #define MIN(a, b) ((a) < (b) ? (a) : (b))
 #endif
 
-const char *can_modes[CAN_STATE_MAX] = {
-	"ACTIVE",
-	"WARNING",
-	"PASSIVE",
-	"BUS OFF",
+const char *can_states[CAN_STATE_MAX] = {
+	"ERROR-ACTIVE",
+	"ERROR-WARNING",
+	"ERROR-PASSIVE",
+	"BUS-OFF",
 	"STOPPED",
 	"SLEEPING"
 };
@@ -59,23 +59,24 @@ const char *can_modes[CAN_STATE_MAX] = {
 static void help(void)
 {
 	fprintf(stderr, "usage:\n\t"
-		"canconfig <dev> bitrate { BR } [sample_point { SP }]\n\t\t"
+		"canconfig <dev> bitrate { BR } [sample-point { SP }]\n\t\t"
 		"BR := <bitrate in Hz>\n\t\t"
-		"SP := <sample point {0...0.999}> (optional)\n\t"
+		"SP := <sample-point {0...0.999}> (optional)\n\t"
 		"canconfig <dev> bittiming [ VALs ]\n\t\t"
 		"VALs := <tq | prop-seg | phase-seg1 | phase-seg2 | sjw>\n\t\t"
 		"tq <time quantum in ns>\n\t\t"
-		"prop_seg <no. in tq>\n\t\t"
-		"phase_seg1 <no. in tq>\n\t\t"
-		"phase_seg2 <no. in tq\n\t\t"
+		"prop-seg <no. in tq>\n\t\t"
+		"phase-seg1 <no. in tq>\n\t\t"
+		"phase-seg2 <no. in tq\n\t\t"
 		"sjw <no. in tq> (optional)\n\t"
-		"canconfig <dev> restart-ms { RESTART_MS }\n\t\t"
-		"RESTART_MS := <autorestart interval in ms>\n\t"
+		"canconfig <dev> restart-ms { RESTART-MS }\n\t\t"
+		"RESTART-MS := <autorestart interval in ms>\n\t"
 		"canconfig <dev> mode { MODE }\n\t\t"
 		"MODE := <[loopback | listen-only | triple-sampling] [on|off]>\n\t"
 		"canconfig <dev> {ACTION}\n\t\t"
-		"ACTION := <[start|stop|restart]>"
-		"canconfig <dev> clockfreq\n"
+		"ACTION := <[start|stop|restart]>\n\t"
+		"canconfig <dev> clockfreq\n\t"
+		"canconfig <dev> bittiming-constants\n"
 		);
 
 	exit(EXIT_FAILURE);
@@ -90,7 +91,7 @@ static void do_show_bitrate(int argc, char* argv[])
 		exit(EXIT_FAILURE);
 	} else
 		fprintf(stdout,
-			"%s bitrate: %u, sample point: %0.3f\n",
+			"%s bitrate: %u, sample-point: %0.3f\n",
 			argv[1], bt.bitrate,
 			(float)((float)bt.sample_point / 1000));
 }
@@ -202,6 +203,24 @@ static void do_show_bittiming(int argc, char *argv[])
 			bt.sjw, bt.brp);
 }
 
+static void do_show_bittiming_const(int argc, char *argv[])
+{
+	const char *name = argv[1];
+	struct can_bittiming_const btc;
+
+	if (can_get_bittiming_const(name, &btc) < 0) {
+		fprintf(stderr, "%s: failed to get bittiming_const\n", argv[1]);
+		exit(EXIT_FAILURE);
+	} else
+		fprintf(stdout, "%s bittiming-constants: name %s,\n\t"
+			"tseg1_min: %u, tseg1_max: %u, "
+			"tseg2_min: %u, tseg2_max: %u,\n\t"
+			"sjw_max %u, brp_min: %u, brp_max: %u, brp_inc: %u,\n",
+			name, btc.name, btc.tseg1_min, btc.tseg1_max,
+			btc.tseg2_min, btc.tseg2_max, btc.sjw_max,
+			btc.brp_min, btc.brp_max, btc.brp_inc);
+}
+
 static void cmd_bittiming(int argc, char *argv[])
 {
 	if (argc >= 4) {
@@ -223,7 +242,7 @@ static void do_show_state(int argc, char *argv[])
 	}
 
 	if (state >= 0 && state < CAN_STATE_MAX)
-		fprintf(stdout, "%s state: %s\n", argv[1], can_modes[state]);
+		fprintf(stdout, "%s state: %s\n", argv[1], can_states[state]);
 	else
 		fprintf(stderr, "%s: unknown state\n", argv[1]);
 }
@@ -257,6 +276,13 @@ static void cmd_clockfreq(int argc, char *argv[])
 	exit(EXIT_SUCCESS);
 }
 
+static void cmd_bittiming_const(int argc, char *argv[])
+{
+	do_show_bittiming_const(argc, argv);
+
+	exit(EXIT_SUCCESS);
+}
+
 static void do_restart(int argc, char *argv[])
 {
 	if (can_do_restart(argv[1]) < 0) {
@@ -395,7 +421,7 @@ static void do_show_restart_ms(int argc, char* argv[])
 		exit(EXIT_FAILURE);
 	} else
 		fprintf(stdout,
-			"%s restart_ms: %u\n", argv[1], restart_ms);
+			"%s restart-ms: %u\n", argv[1], restart_ms);
 }
 
 static void do_set_restart_ms(int argc, char* argv[])
@@ -430,10 +456,12 @@ static void cmd_baudrate(int argc, char *argv[])
 static void cmd_show_interface(int argc, char *argv[])
 {
 	do_show_bitrate(argc, argv);
+	do_show_bittiming(argc, argv);
 	do_show_state(argc, argv);
 	do_show_restart_ms(argc, argv);
-	do_show_clockfreq(argc, argv);
 	do_show_ctrlmode(argc, argv);
+	do_show_clockfreq(argc, argv);
+	do_show_bittiming_const(argc, argv);
 
 	exit(EXIT_SUCCESS);
 }
@@ -467,6 +495,8 @@ int main(int argc, char *argv[])
 		cmd_state(argc, argv);
 	if (!strcmp(argv[2], "clockfreq"))
 		cmd_clockfreq(argc, argv);
+	if (!strcmp(argv[2], "bittiming-constants"))
+		cmd_bittiming_const(argc, argv);
 
 	help();
 
_______________________________________________
Socketcan-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-users

Reply via email to