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, ®, 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, ®, 1) != 1)
- sysfatal("write: %r");- if (read(fd, ®, 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);
}
--
⑨