shithub: util

ref: 9c14131a7c789bf6a9d4f38db48d04461735d948
dir: /ads7830.c/

View raw version
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>

#define DATA "%s/i2c.%x.data"
#define CTL "%s/i2c.%x.ctl"

char *i2cdir = "/dev/i2c1";

enum {
	Addr=	0x48,
		Diff01=	0x00,
		Diff23,
		Diff45,
		Diff67,
		Diff10,
		Diff32,
		Diff54,
		Diff76,
		Single0,
		Single2,
		Single4,
		Single6,
		Single8,
		Single1,
		Single3,
		Single5,
		Single7,
};

void
dataread(char *reg, int r, char *buf, int n)
{
	char *fname;
	int fd;

	fname = smprint(DATA, i2cdir, Addr);
	if (fname == nil)
		sysfatal("smprint: %r");

	fd = open(fname, ORDWR);
	if (fd == -1)
		sysfatal("open: %r");

	free(fname);

	if (write(fd, reg, r) != r)
		fprint(2, "write: %r\n");

	if (read(fd, buf, n) != n)
		fprint(2, "read: %r\n");

	close(fd);
}

uchar
readch(uchar ch)
{
	char cmd;
	char value;

	if (ch > 7)
		return 0;

	cmd = 0;
	if ((ch % 2) == 0)
		cmd |= (Single0 + (ch / 2));
	else
		cmd |= (Single1 + ((ch - 1) / 2));
	cmd <<= 4;
	cmd |= 0x03;

	dataread(&cmd, 1, &value, 1);

	return (uchar)value;
}

void
fsread(Req *r)
{
	int ch;
	uchar value;
	char *buf;

	switch ((intptr)(r->fid->file->aux)) {
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
	case 6:
	case 7:
	case 8:
		ch = ((intptr)(r->fid->file->aux) - 1);
		value = readch((uchar)ch);
		buf = smprint("%4d\n", value);

		readstr(r, buf);
		respond(r, nil);

		free(buf);
		break;
	default:
		respond(r, "error");
		break;
	}
}

Srv fs = {
.read	= fsread,
};

void
main()
{
	int i;
	char buf[32];

	readch(0); // is there hardware?

	fs.tree = alloctree("ads7830", "ads7830", DMDIR|0555, nil);
	for (i = 0; i < 8; i++) {
		snprint(buf, 32, "adc%d", i);
		createfile(fs.tree->root, buf, "ads7830", 0444, (void*)(i+1));
	}
	postmountsrv(&fs, "ads7830", "/dev", MBEFORE);
}