summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux
diff options
context:
space:
mode:
authorSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2022-08-21 01:30:03 +0000
committerSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2022-08-21 01:30:03 +0000
commita78b71b143240fa1dad019f5c655a03c2d2400d9 (patch)
treee89536e837fbd4a921542d81e73d7315b4da3ac4 /sys/src/cmd/aux
parent5e15db8fa31dd68fee22f260ae797a38ccaa4070 (diff)
move and rename MNT Reform 2 support utilies, cat manpages into one
Aux/imx8pm and aux/wm8960 had pretty cryptic names and it made more sense to use a reform/pm and reform/audio naming, accordingly. Instead of having special mount points /mnt/pm and /mnt/wm8960, /dev is used directly, removing the need to do any manual work - stats(1) will continue showing the CPU temperature, and zuke(1) will still be able to control the volume, etc. Brightness controls were changed to a better interface - /dev/light, where each line contains a "a_thing its_light_value". This way more parts can be controlled. Right now it's only "lcd", but later it might be "kbd" and "trackball" as well. Example of lib/profile: reform/audio echo master 80 > /dev/volume reform/pm echo lcd 100 > /dev/light
Diffstat (limited to 'sys/src/cmd/aux')
-rw-r--r--sys/src/cmd/aux/imx8pm.c247
-rw-r--r--sys/src/cmd/aux/mkfile2
-rw-r--r--sys/src/cmd/aux/wm8960.c370
3 files changed, 0 insertions, 619 deletions
diff --git a/sys/src/cmd/aux/imx8pm.c b/sys/src/cmd/aux/imx8pm.c
deleted file mode 100644
index edcd81bb7..000000000
--- a/sys/src/cmd/aux/imx8pm.c
+++ /dev/null
@@ -1,247 +0,0 @@
-#include <u.h>
-#include <libc.h>
-#include <fcall.h>
-#include <thread.h>
-#include <9p.h>
-
-enum
-{
- Mhz = 1000*1000,
- Pwmsrcclk = 25*Mhz,
-
- Ctl = 1,
- Temp,
-
- PWMSAR = 0x0c/4,
- PWMPR = 0x10/4,
-
- TMUTMR = 0x00/4,
- TMR_ME = 1<<31,
- TMR_ALPF_SHIFT = 26,
- TMR_MSITE_SHIFT = 13,
- TMUTSR = 0x04/4,
- TSR_MIE = 1<<30,
- TSR_ORL = 1<<29,
- TSR_ORH = 1<<28,
- TMUTMTMIR = 0x08/4,
- TMUTIER = 0x20/4,
- TMUTIDR = 0x24/4,
- TIDR_MASK = 0xe0000000,
- TMUTISCR = 0x28/4,
- TMUTICSCR = 0x2c/4,
- TMUTTCFGR = 0x80/4,
- TMUTSCFGR = 0x84/4,
- TMUTRITSR0 = 0x100/4,
- TMUTRITSR1 = 0x110/4,
- TMUTRITSR2 = 0x120/4,
- TMUTTR0CR = 0xf10/4,
- TMUTTR1CR = 0xf14/4,
- TMUTTR2CR = 0xf18/4,
- TMUTTR3CR = 0xf1c/4,
- CR_CAL_PTR_SHIFT = 16,
-
-};
-
-static u32int *pwm2, *tmu;
-static char *uid = "mntpm";
-
-static void
-wr(u32int *base, int reg, u32int v)
-{
- //fprint(2, "[0%x] ← 0x%ux\n", reg*4, v);
- if(base != nil)
- base[reg] = v;
-}
-
-static u32int
-rd(u32int *base, int reg)
-{
- return base != nil ? base[reg] : -1;
-}
-
-static void
-setbrightness(int p)
-{
- u32int v;
-
- if(p < 0)
- p = 0;
- if(p > 100)
- p = 100;
-
- v = Pwmsrcclk / rd(pwm2, PWMSAR);
- wr(pwm2, PWMPR, (Pwmsrcclk/(v*p/100))-2);
-}
-
-static int
-getbrightness(void)
-{
- u32int m, v;
-
- m = Pwmsrcclk / rd(pwm2, PWMSAR);
- v = Pwmsrcclk / (rd(pwm2, PWMPR)+2);
- return v*100/m;
-}
-
-static int
-getcputemp(int c[3])
-{
- int i, r[] = {TMUTRITSR0, TMUTRITSR1, TMUTRITSR2};
- u32int s;
-
- s = rd(tmu, TMUTSR);
- if(s & TSR_MIE){
- werrstr("monitoring interval exceeded");
- return -1;
- }
- if(s & (TSR_ORL|TSR_ORH)){
- werrstr("out of range");
- return -1;
- }
-
- c[0] = c[1] = c[2] = 0;
- for(;;){
- for(i = 0; i < 3; i++)
- if(c[i] >= 0)
- c[i] = rd(tmu, r[i]);
- if(c[0] < 0 && c[1] < 0 && c[2] < 0)
- break;
- sleep(10);
- }
- c[0] &= 0xff;
- c[1] &= 0xff;
- c[2] &= 0xff;
- return 0;
-}
-
-static void
-tmuinit(void)
-{
- /* without proper calibration data sensing is useless */
- static u8int cfg[4][12] = {
- {0x23, 0x29, 0x2f, 0x35, 0x3d, 0x43, 0x4b, 0x51, 0x57, 0x5f, 0x67, 0x6f},
- {0x1b, 0x23, 0x2b, 0x33, 0x3b, 0x43, 0x4b, 0x55, 0x5d, 0x67, 0x70, 0},
- {0x17, 0x23, 0x2d, 0x37, 0x41, 0x4b, 0x57, 0x63, 0x6f, 0},
- {0x15, 0x21, 0x2d, 0x39, 0x45, 0x53, 0x5f, 0x71, 0},
- };
- int i, j;
-
- wr(tmu, TMUTMR, 0); /* disable */
- wr(tmu, TMUTIER, 0); /* disable all interrupts */
- wr(tmu, TMUTMTMIR, 0xf); /* no monitoring interval */
-
- /* configure default ranges */
- wr(tmu, TMUTTR0CR, 11<<CR_CAL_PTR_SHIFT | 0);
- wr(tmu, TMUTTR1CR, 10<<CR_CAL_PTR_SHIFT | 38);
- wr(tmu, TMUTTR2CR, 8<<CR_CAL_PTR_SHIFT | 72);
- wr(tmu, TMUTTR3CR, 7<<CR_CAL_PTR_SHIFT | 97);
-
- /* calibration data */
- for(i = 0; i < 4; i++){
- for(j = 0; j < 12 && cfg[i][j] != 0; j++){
- wr(tmu, TMUTTCFGR, i<<16|j);
- wr(tmu, TMUTSCFGR, cfg[i][j]);
- }
- }
-
- /* enable: all sites, ALPF 11=0.125 */
- wr(tmu, TMUTMR, TMR_ME | 3<<TMR_ALPF_SHIFT | 7<<TMR_MSITE_SHIFT);
-}
-
-static void
-fsread(Req *r)
-{
- char msg[256];
- int c[3];
-
- msg[0] = 0;
- if(r->ifcall.offset == 0){
- if(r->fid->file->aux == (void*)Ctl)
- snprint(msg, sizeof(msg), "brightness %d\n", getbrightness());
- else if(r->fid->file->aux == (void*)Temp){
- if(getcputemp(c) == 0)
- snprint(msg, sizeof(msg), "%d.0\n", c[0]);
- else
- snprint(msg, sizeof(msg), "%r\n");
- }
- }
-
- readstr(r, msg);
- respond(r, nil);
-}
-
-static void
-fswrite(Req *r)
-{
- char msg[256], *f[4];
- int nf, v;
-
- if(r->fid->file->aux == (void*)Ctl){
- snprint(msg, sizeof(msg), "%.*s",
- utfnlen((char*)r->ifcall.data, r->ifcall.count), (char*)r->ifcall.data);
- nf = tokenize(msg, f, nelem(f));
- if(nf < 2){
- respond(r, "invalid ctl message");
- return;
- }
- if(strcmp(f[0], "brightness") == 0){
- v = atoi(f[1]);
- if(*f[1] == '+' || *f[1] == '-')
- v += getbrightness();
- setbrightness(v);
- }
- }
-
- r->ofcall.count = r->ifcall.count;
- respond(r, nil);
-}
-
-static Srv fs = {
- .read = fsread,
- .write = fswrite,
-};
-
-static void
-usage(void)
-{
- fprint(2, "usage: aux/imx8pm [-D] [-m /mnt/pm] [-s service]\n");
- exits("usage");
-}
-
-void
-main(int argc, char **argv)
-{
- char *mtpt, *srv;
-
- mtpt = "/mnt/pm";
- srv = nil;
- ARGBEGIN{
- case 'D':
- chatty9p = 1;
- break;
- case 'm':
- mtpt = EARGF(usage());
- break;
- case 's':
- srv = EARGF(usage());
- break;
- default:
- usage();
- }ARGEND
-
- fs.tree = alloctree(uid, uid, DMDIR|0555, nil);
- createfile(fs.tree->root, "ctl", uid, 0666, (void*)Ctl);
-
- if((tmu = segattach(0, "tmu", 0, 0xf20)) == (void*)-1)
- tmu = nil;
- else{
- createfile(fs.tree->root, "cputemp", uid, 0444, (void*)Temp);
- tmuinit();
- }
- if((pwm2 = segattach(0, "pwm2", 0, 0x18)) == (void*)-1)
- pwm2 = nil;
-
- postmountsrv(&fs, srv, mtpt, MREPL);
-
- exits(nil);
-}
diff --git a/sys/src/cmd/aux/mkfile b/sys/src/cmd/aux/mkfile
index 76ef6a082..1ef302c45 100644
--- a/sys/src/cmd/aux/mkfile
+++ b/sys/src/cmd/aux/mkfile
@@ -22,7 +22,6 @@ TARG=\
getflags\
icanhasmsi\
icanhasvmx\
- imx8pm\
lines\
listen\
listen1\
@@ -50,7 +49,6 @@ TARG=\
write\
wacom\
wikifmt\
- wm8960\
wpa\
zerotrunc\
diff --git a/sys/src/cmd/aux/wm8960.c b/sys/src/cmd/aux/wm8960.c
deleted file mode 100644
index 0250d05bf..000000000
--- a/sys/src/cmd/aux/wm8960.c
+++ /dev/null
@@ -1,370 +0,0 @@
-#include <u.h>
-#include <libc.h>
-#include <fcall.h>
-#include <thread.h>
-#include <9p.h>
-
-#define MIN(a,b) (a<b?a:b)
-#define MAX(a,b) (a>b?a:b)
-#define CLAMP(x,a,b) MAX(a,MIN(x,b))
-
-typedef struct Out Out;
-
-enum
-{
- Dac,
- Hp,
- Spk,
- Nout,
-
- Ctl = 1,
- Vol,
-};
-
-struct Out
-{
- char *name;
- int volreg;
- int volmax;
- int togglemask;
- void (*toggle)(Out *o, int on);
- int on;
- int vol[2];
-};
-
-static char *uid = "audio";
-static int data;
-static int reg1a;
-static int rate = 44100;
-static int ⅓d;
-
-static void
-wr(int a, int v)
-{
- u8int c;
-
- //fprint(2, "[0x%x] ← 0x%ux\n", a, v & 0x1ff);
- c = v & 0xff;
- if(pwrite(data, &c, 1, a<<1 | ((v>>8)&1)) < 1)
- fprint(2, "reg %x write failed: %r\n", a);
-}
-
-static void
-classdspk(Out *, int on)
-{
- wr(0x31, (on ? 3 : 0)<<6 | 0x37); /* class D SPK out */
-}
-
-static void
-toggle(Out *o, int on)
-{
- if(on)
- reg1a |= o->togglemask;
- else
- reg1a &= ~o->togglemask;
- wr(0x1a, reg1a);
- if(o->toggle != nil)
- o->toggle(o, on);
- o->on = on;
-}
-
-static Out out[Nout] =
-{
- [Dac] = {"master", 0x0a, 0xf9, 3<<7, nil, 0},
- [Hp] = {"hp", 0x02, 0x7f, 3<<5, nil, 0},
- [Spk] = {"spk", 0x28, 0x7f, 3<<3, classdspk, 0},
-};
-
-static void
-setvol(Out *o, int l, int r)
-{
- int zc;
-
- o->vol[0] = l = CLAMP(l, 0, 100);
- o->vol[1] = r = CLAMP(r, 0, 100);
- if(l > 0)
- l += o->volmax - 100;
- if(r > 0)
- r += o->volmax - 100;
-
- zc = o->volmax < 0x80;
- wr(o->volreg+0, 0<<8 | zc<<7 | l);
- wr(o->volreg+1, 1<<8 | zc<<7 | r);
-}
-
-static void
-set3d(int x)
-{
- ⅓d = CLAMP(x, 0, 100);
- x = (⅓d+5)/7;
- wr(0x10, x<<1 | (x ? 1 : 0)<<0);
-}
-
-static int
-setrate(int s)
-{
- u32int k;
-
- if(s != 44100 && s != 48000)
- return -1;
-
- /*
- * getting DAC ready for s16c2r44100:
- *
- * mclk₀ = 25Mhz (set in sai)
- * pllprescale = /2 → *actual* mclk₁ is 25/2 = 12.5Mhz
- * sysclk = 44.1kHz*256 = 11.2896Mhz
- * → dacdiv = /(1*256) = sysclk/(1*256) = 44.1kHz
- * f₂ = 4*2*sysclk = 90.3168Mhz
- *
- * PLL freq ration:
- * R = f₂/mclk₁
- * N = int(R) = 7
- * K = 2²⁴*(R-N) = 3780644.9623
- *
- * dacdiv = /(1*256) → DAC at max rate
- * → pick bclk rate 1.4112Mhz (sysclk/8)
- * → bclkdiv = /8
- *
- * class D clk needs to be ~768kHz (700-800)
- * → sysclk/768000 = 14
- * → dclkdiv = /16 → dclk = 705.6kHz
- */
- wr(0x1a, reg1a = reg1a & ~(1<<0)); /* disable pll */
-
- wr(0x04,
- 0<<3 | /* dacdiv → sysclk/(1*256) = 44100 */
- 2<<1 | /* sysclkdiv → /2 */
- 1<<0 | /* clksel → pll output */
- 0
- );
- wr(0x34,
- 1<<5 | /* enable fractional mode */
- 1<<4 | /* pllprescale */
- 7<<0 | /* N */
- 0
- );
- k = s == 44100 ? 3780645 : 14500883; /* K */
- wr(0x35, (k>>16) & 0xff);
- wr(0x36, (k>>8) & 0xff);
- wr(0x37, k & 0xff);
-
- wr(0x08, 7<<6 | 7<<0); /* dclkdiv → sysclk/16; bclkdiv → sysclk/8 */
- wr(0x1a, reg1a = reg1a | 1<<0); /* enable pll */
-
- rate = s;
-
- return 0;
-}
-
-static void
-reset(void)
-{
- int i;
-
- for(i = 0; i < Nout; i++){
- out[i].vol[0] = -1;
- out[i].vol[1] = -1;
- }
-
- toggle(out+Dac, 0);
- wr(0x1c, 1<<7 | 1<<4 | 1<<3 | 1<<2); /* Vmid/r bias; Vgs/r on; Vmid soft start */
- wr(0x19, 0<<7); /* Vmid off, Vref off */
- sleep(500);
- wr(0x0f, 0); /* reset registers to default */
-
- setrate(rate);
- set3d(⅓d);
-
- wr(0x07, 1<<6 | 2); /* master mode; i²s, 16-bit words */
-
- wr(0x17, 1<<8 | 3<<6 | 0<<1); /* thermal shutdown on; avdd=3.3v; slow clock on */
-
- wr(0x06, 1<<3 | 1<<2); /* ramp up DAC volume slowly */
- wr(0x2f, 3<<2); /* output mixer on */
- wr(0x22, 1<<8); /* L DAC to mixer */
- wr(0x25, 1<<8); /* R DAC to mixer */
-
- wr(0x17, 1<<8 | 3<<6 | 1<<0); /* thermal shutdown on; avdd=3.3v; slow clock on */
- wr(0x1c, 1<<7 | 1<<4 | 1<<3 | 1<<2); /* Vmid/r bias; Vgs/r on; Vmid soft start */
- wr(0x19, 1<<7); /* start Vmid (playback) */
- sleep(650);
- wr(0x1c, 1<<3); /* done with anti-pop */
- wr(0x19, 1<<7 | 1<<6); /* Vref on */
-
- wr(0x09, 1<<6); /* adclrc → gpio (for jack detect output) */
- wr(0x30, 3<<4 | 2<<2 | 1<<1); /* JD2 jack detect in; Tsense on */
- wr(0x1b, 1<<3); /* HP_[LR] responsive to jack detect */
- wr(0x18, 1<<6); /* HP switch on; high = HP */
-
- /* turn on all outputs */
- toggle(out+Hp, 1);
- toggle(out+Spk, 1);
- toggle(out+Dac, 1);
-
- /* sensible defaults */
- setvol(out+Spk, 100, 100);
- setvol(out+Hp, 75, 75);
- setvol(out+Dac, 80, 80);
-
- /*
- * Jack detect becomes extremely unstable when playing on spk and the
- * volume is very high - DAC start to switch back and forth between two
- * outputs. Solve this by always attenuating by -6dB and somewhat limiting
- * the volume on DAC ("master") - to 0xf9 instead of 0xff (max).
- */
- wr(0x05, 1<<7 | 0<<3); /* unmute DAC */
-}
-
-static void
-fsread(Req *r)
-{
- char msg[256], *s, *e;
- Out *o;
- int i;
-
- s = msg;
- e = msg+sizeof(msg);
- *s = 0;
- if(r->fid->file->aux == (void*)Ctl){
- for(i = 0, o = out; i < Nout; i++, o++)
- s = seprint(s, e, "%s %s\n", o->name, o->on ? "on" : "off");
- }else if(r->fid->file->aux == (void*)Vol){
- for(i = 0, o = out; i < Nout; i++, o++)
- s = seprint(s, e, "%s %d %d\n", o->name, o->vol[0], o->vol[1]);
- s = seprint(s, e, "speed %d\n", rate);
- }
- seprint(s, e, "3d %d\n", ⅓d);
-
- readstr(r, msg);
- respond(r, nil);
-}
-
-static int
-setoradd(int x, char *s)
-{
- int d;
-
- d = atoi(s);
- if(*s == '+' || *s == '-')
- return x + d;
-
- return d;
-}
-
-static void
-fswrite(Req *r)
-{
- int nf, on, i, vl, vr;
- char msg[256], *f[4];
- Out *o;
-
- snprint(msg, sizeof(msg), "%.*s",
- utfnlen((char*)r->ifcall.data, r->ifcall.count), (char*)r->ifcall.data);
- nf = tokenize(msg, f, nelem(f));
- if(nf == 1 && strcmp(f[0], "reset") == 0){
- reset();
- goto Done;
- }else if(nf == 2 && strcmp(f[0], "speed") == 0){
- if(setrate(atoi(f[1])) != 0){
- respond(r, "not supported");
- return;
- }
- goto Done;
- }else if(nf == 2 && strcmp(f[0], "3d") == 0){
- set3d(atoi(f[1]));
- goto Done;
- }
- if(nf < 2){
-Emsg:
- respond(r, "invalid ctl message");
- return;
- }
-
- for(i = 0, o = out; i < Nout && strcmp(f[0], o->name) != 0; i++, o++)
- ;
- if(i >= Nout)
- goto Emsg;
-
- if(r->fid->file->aux == (void*)Ctl){
- if(nf != 2)
- goto Emsg;
- if(strcmp(f[1], "on") == 0)
- on = 1;
- else if(strcmp(f[1], "off") == 0)
- on = 0;
- else if(strcmp(f[1], "toggle") == 0)
- on = !o->on;
- else
- goto Emsg;
- toggle(o, on);
- }else if(r->fid->file->aux == (void*)Vol){
- vl = setoradd(o->vol[0], f[1]);
- vr = setoradd(o->vol[1], nf < 3 ? f[1] : f[2]);
- setvol(o, vl, vr);
- }
-
-Done:
- r->ofcall.count = r->ifcall.count;
- respond(r, nil);
-}
-
-static Srv fs = {
- .read = fsread,
- .write = fswrite,
-};
-
-static void
-usage(void)
-{
- fprint(2, "usage: aux/wm8960 [-1] [-D] [-m /mnt/pm] [-s service]\n");
- exits("usage");
-}
-
-void
-main(int argc, char **argv)
-{
- char *mtpt, *srv;
- int ctl, oneshot;
-
- mtpt = "/mnt/wm8960";
- srv = nil;
- oneshot = 0;
- ARGBEGIN{
- case '1':
- oneshot = 1;
- break;
- case 'D':
- chatty9p = 1;
- break;
- case 'm':
- mtpt = EARGF(usage());
- break;
- case 's':
- srv = EARGF(usage());
- break;
- default:
- usage();
- }ARGEND
-
- if((data = open("#J/i2c3/i2c.1a.data", OWRITE)) < 0)
- sysfatal("i2c data: %r");
- if((ctl = open("#J/i2c3/i2c.1a.ctl", OWRITE)) < 0)
- sysfatal("i2c ctl: %r");
- fprint(ctl, "subaddress 1\n");
- fprint(ctl, "size %d\n", 0x38<<1);
- close(ctl);
-
- reset();
-
- if(oneshot)
- exits(nil);
-
- fs.tree = alloctree(uid, uid, DMDIR|0555, nil);
- createfile(fs.tree->root, "audioctl", uid, 0666, (void*)Ctl);
- createfile(fs.tree->root, "volume", uid, 0666, (void*)Vol);
-
- postmountsrv(&fs, srv, mtpt, MREPL);
-
- exits(nil);
-}