/* * Set clock rate to hz (or max speed if hz == 0) */ void setclkrate(int clkid, ulong hz) { u32int buf[2]; buf[0] = clkid; if(hz != 0) buf[1] = hz; else if(vcreq(TagGetclkmax, buf, sizeof(buf[0]), sizeof(buf)) != sizeof buf) return; vcreq(TagSetclkspd, buf, sizeof(buf), sizeof(buf)); }
static int fbdefault(int *width, int *height, int *depth) { u32int buf[3]; if(vcreq(TagGetres, &buf[0], 0, 2*4) != 2*4 || vcreq(TagGetdepth, &buf[2], 0, 4) != 4) return -1; *width = buf[0]; *height = buf[1]; *depth = buf[2]; return 0; }
static int fbdefault(int *width, int *height, int *depth) { u32int buf[3]; char *p; if(vcreq(TagGetres, &buf[0], 0, 2*4) != 2*4 || vcreq(TagGetdepth, &buf[2], 0, 4) != 4) return -1; *width = buf[0]; *height = buf[1]; if((p = getconf("bcm2708_fb.fbdepth")) != nil) *depth = atoi(p); else *depth = buf[2]; return 0; }
/* * Get firmware revision */ uint getfirmware(void) { u32int buf[1]; if(vcreq(TagGetfwrev, buf, 0, sizeof buf) != sizeof buf) return 0; return buf[0]; }
/* * Power management */ void setpower(int dev, int on) { u32int buf[2]; buf[0] = dev; buf[1] = Powerwait | (on? 1 : 0); vcreq(TagSetpower, buf, sizeof buf, sizeof buf); }
/* * Get board revision */ uint getboardrev(void) { u32int buf[1]; if(vcreq(TagGetrev, buf, 0, sizeof buf) != sizeof buf) return 0; return buf[0]; }
/* * Get clock rate */ ulong getclkrate(int clkid) { u32int buf[2]; buf[0] = clkid; if(vcreq(TagGetclkspd, buf, sizeof(buf[0]), sizeof(buf)) != sizeof buf) return 0; return buf[1]; }
/* * Get ARM ram */ void getramsize(Confmem *mem) { u32int buf[2]; if(vcreq(TagGetram, buf, 0, sizeof buf) != sizeof buf) return; mem->base = buf[0]; mem->limit = buf[1]; }
int fbblank(int blank) { u32int buf[1]; buf[0] = blank; if(vcreq(TagFbblank, buf, sizeof buf, sizeof buf) != sizeof buf) return -1; return buf[0] & 1; }
/* * Get cpu temperature */ uint getcputemp(void) { u32int buf[2]; buf[0] = 0; if(vcreq(TagGettemp, buf, sizeof(buf[0]), sizeof buf) != sizeof buf) return 0; return buf[1]; }
int getpower(int dev) { u32int buf[2]; buf[0] = dev; buf[1] = 0; if(vcreq(TagGetpower, buf, sizeof buf[0], sizeof buf) != sizeof buf) return -1; return buf[0] & 1; }
/* * Virtual GPIO - used for ACT LED on pi3 */ void vgpinit(void) { u32int buf[1]; uintptr va; buf[0] = 0; if(vcreq(TagGetGpio, buf, 0, sizeof(buf)) != sizeof buf || buf[0] == 0) return; va = mmukmap(VGPIO, buf[0] & ~0xC0000000, BY2PG); if(va == 0) return; vgpio.counts = (u32int*)va; }
/* * Get ethernet address (as hex string) * [not reentrant] */ char * getethermac(void) { uchar ea[8]; char *p; int i; static char buf[16]; memset(ea, 0, sizeof ea); vcreq(TagGetmac, ea, 0, sizeof ea); p = buf; for(i = 0; i < 6; i++) p += sprint(p, "%.2x", ea[i]); return buf; }