shithub: util

Download patch

ref: 8a81df27372881fa2f41e196c72a6c58aafd9e2a
parent: 54fbb1ea3332ec5ab5025569d7c25a388c642803
author: glenda <glenda@kingship>
date: Sat Nov 22 13:52:43 EST 2025

mcp7940x coarse trim setting

--- a/mcp7940x.c
+++ b/mcp7940x.c
@@ -196,6 +196,43 @@
 	return fd;
 }
 
+uchar
+rtcctl(int writemode, int crstrim)
+{
+	int fd;
+	uchar reg;
+	uchar buf[2];
+
+	fd = datafd();
+
+	reg = Control;
+	if (write(fd, &reg, 1) != 1)
+		sysfatal("write: %r");
+	if (read(fd, buf, 1) != 1)
+		sysfatal("read: %r");
+
+	if (writemode == 0) {
+		close(fd);
+		return buf[0];
+	}
+
+	reg = buf[0];
+
+	if (crstrim != 0)
+		reg |= CrsTrim;
+	else
+		reg &= ~CrsTrim;
+
+	buf[0] = Control;
+	buf[1] = reg;
+	if (write(fd, buf, 2) != 2)
+		sysfatal("write: %r");
+
+	close(fd);
+
+	return buf[1];
+}
+
 void
 fsread(Req *r)
 {
@@ -209,6 +246,7 @@
 	int offs;
 	int len;
 	int i;
+	uchar ctl;
 
 	clk[0] = 0;
 
@@ -290,6 +328,14 @@
 
 		readbuf(r, buf, len);
 		respond(r, nil);
+	} else if ((intptr)(r->fid->file->aux) == 4) {
+		ctl = rtcctl(0, 0);
+
+		snprint(buf, 256, "crstrim %d\n" , ctl & CrsTrim? 1: 0);
+		len = strlen(buf);
+
+		readbuf(r, buf, len);
+		respond(r, nil);
 	} else {
 		respond(r, "file not found");
 	}
@@ -403,6 +449,20 @@
 		r->ofcall.count = len;
 
 		respond(r, nil);
+	} else if ((intptr)(r->fid->file->aux) == 4) {
+		p = r->ifcall.data;
+
+		if (cistrncmp(p, "crstrim ", 8) == 0) {
+			p += 8;
+			i = atoi(p);
+
+			rtcctl(1, i);
+
+			respond(r, nil);
+			return;
+		}
+
+		respond(r, "invalid ctl message");
 	} else {
 		respond(r, "file not found");
 	}
@@ -426,31 +486,13 @@
 void
 main()
 {
-	int fd;
-	uchar reg;
-	uchar buf[2];
-
 	ctl("size 256");
 	ctl("subaddress 0");
 
-	fd = datafd();
-
-	reg = Control;
-	if (write(fd, &reg, 1) != 1)
-		sysfatal("write: %r");
-	if (read(fd, &reg, 1) != 1)
-		sysfatal("read: %r");
-	reg |= CrsTrim;
-	buf[0] = Control;
-	buf[1] = reg;
-	if (write(fd, buf, 2) != 2)
-		sysfatal("write: %r");
-
-	close(fd);
-
 	fs.tree = alloctree("mcp7940x", "mcp7940x", DMDIR|0555, nil);
 	createfile(fs.tree->root, "rtc", "mcp7940x", 0666, (void*)1);
 	createfile(fs.tree->root, "rtctrim", "mcp7940x", 0666, (void*)2);
 	createfile(fs.tree->root, "rtcsram", "mcp7940x", 0666, (void*)3);
+	createfile(fs.tree->root, "rtcctl", "mcp7940x", 0666, (void*)4);
 	postmountsrv(&fs, "mcp7940x", "/dev", MBEFORE);
 }
--