summaryrefslogtreecommitdiffstats
path: root/sys/qcam/qcam-lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/qcam/qcam-lib.c')
-rw-r--r--sys/qcam/qcam-lib.c595
1 files changed, 326 insertions, 269 deletions
diff --git a/sys/qcam/qcam-lib.c b/sys/qcam/qcam-lib.c
index cacd5d08..e7208cdc 100644
--- a/sys/qcam/qcam-lib.c
+++ b/sys/qcam/qcam-lib.c
@@ -53,11 +53,11 @@ OTHER DEALINGS IN THE SOFTWARE.
/* Prototypes for static functions. Externally visible functions
* should be prototyped in qcam.h */
-static int qc_waithand(const struct qcam *q, int val);
-static int qc_command(const struct qcam *q, int command);
-static int qc_readparam(const struct qcam *q);
-static int qc_setscanmode(struct qcam *q);
-static int qc_readbytes(const struct qcam *q, char buffer[]);
+static int qc_waithand (const struct qcam *q, int val);
+static int qc_command (const struct qcam *q, int command);
+static int qc_readparam (const struct qcam *q);
+static int qc_setscanmode (struct qcam *q);
+static int qc_readbytes (const struct qcam *q, char buffer[]);
/* The next several functions are used for controlling the qcam
* structure. They aren't used inside this library, but they should
@@ -65,15 +65,17 @@ static int qc_readbytes(const struct qcam *q, char buffer[]);
/* Gets/sets the brightness. */
-int qc_getbrightness(const struct qcam *q)
+int
+qc_getbrightness (const struct qcam *q)
{
return q->brightness;
}
-int qc_setbrightness(struct qcam *q, int val)
+int
+qc_setbrightness (struct qcam *q, int val)
{
if (val >= 0 && val <= 255) {
- q->brightness=val;
+ q->brightness = val;
return 0;
}
return 1;
@@ -82,15 +84,17 @@ int qc_setbrightness(struct qcam *q, int val)
/* Gets/sets the contrast */
-int qc_getcontrast(const struct qcam *q)
+int
+qc_getcontrast (const struct qcam *q)
{
return q->contrast;
}
-int qc_setcontrast(struct qcam *q, int val)
+int
+qc_setcontrast (struct qcam *q, int val)
{
if (val >= 0 && val <= 255) {
- q->contrast=val;
+ q->contrast = val;
return 0;
}
return 1;
@@ -99,15 +103,17 @@ int qc_setcontrast(struct qcam *q, int val)
/* Gets/sets the white balance */
-int qc_getwhitebal(const struct qcam *q)
+int
+qc_getwhitebal (const struct qcam *q)
{
return q->whitebal;
}
-int qc_setwhitebal(struct qcam *q, int val)
+int
+qc_setwhitebal (struct qcam *q, int val)
{
if (val >= 0 && val <= 255) {
- q->whitebal=val;
+ q->whitebal = val;
return 0;
}
return 1;
@@ -116,45 +122,51 @@ int qc_setwhitebal(struct qcam *q, int val)
/* Gets/sets the resolution */
-void qc_getresolution(const struct qcam *q, int *x, int *y)
+void
+qc_getresolution (const struct qcam *q, int *x, int *y)
{
- *x=q->width;
- *y=q->height;
+ *x = q->width;
+ *y = q->height;
}
-int qc_setresolution(struct qcam *q, int x, int y)
+int
+qc_setresolution (struct qcam *q, int x, int y)
{
if (x >= 0 && x <= 336 && y >= 0 && y <= 243) {
- q->width=x;
- q->height=y;
+ q->width = x;
+ q->height = y;
return 0;
}
return 1;
}
-int qc_getheight(const struct qcam *q)
+int
+qc_getheight (const struct qcam *q)
{
return q->height;
}
-int qc_setheight(struct qcam *q, int y)
+int
+qc_setheight (struct qcam *q, int y)
{
if (y >= 0 && y <= 243) {
- q->height=y;
+ q->height = y;
return 0;
}
return 1;
}
-int qc_getwidth(const struct qcam *q)
+int
+qc_getwidth (const struct qcam *q)
{
return q->width;
}
-int qc_setwidth(struct qcam *q, int x)
+int
+qc_setwidth (struct qcam *q, int x)
{
if (x >= 0 && x <= 336) {
- q->width=x;
+ q->width = x;
return 0;
}
return 1;
@@ -162,26 +174,30 @@ int qc_setwidth(struct qcam *q, int x)
/* Gets/sets the bit depth */
-int qc_getbitdepth(const struct qcam *q)
+int
+qc_getbitdepth (const struct qcam *q)
{
return q->bpp;
}
-int qc_setbitdepth(struct qcam *q, int val)
+int
+qc_setbitdepth (struct qcam *q, int val)
{
if (val == 4 || val == 6) {
- q->bpp=val;
- return qc_setscanmode(q);
+ q->bpp = val;
+ return qc_setscanmode (q);
}
return 1;
}
-int qc_gettop(const struct qcam *q)
+int
+qc_gettop (const struct qcam *q)
{
return q->top;
}
-int qc_settop(struct qcam *q, int val)
+int
+qc_settop (struct qcam *q, int val)
{
if (val >= 1 && val <= 243) {
q->top = val;
@@ -190,12 +206,14 @@ int qc_settop(struct qcam *q, int val)
return 1;
}
-int qc_getleft(const struct qcam *q)
+int
+qc_getleft (const struct qcam *q)
{
return q->left;
}
-int qc_setleft(struct qcam *q, int val)
+int
+qc_setleft (struct qcam *q, int val)
{
if (val % 2 == 0 && val >= 2 && val <= 336) {
q->left = val;
@@ -204,22 +222,24 @@ int qc_setleft(struct qcam *q, int val)
return 1;
}
-int qc_gettransfer_scale(const struct qcam *q)
+int
+qc_gettransfer_scale (const struct qcam *q)
{
return q->transfer_scale;
}
-int qc_settransfer_scale(struct qcam *q, int val)
+int
+qc_settransfer_scale (struct qcam *q, int val)
{
if (val == 1 || val == 2 || val == 4) {
q->transfer_scale = val;
- return qc_setscanmode(q);
+ return qc_setscanmode (q);
}
return 1;
}
int
-qc_calibrate(struct qcam *q)
+qc_calibrate (struct qcam *q)
/* bugfix by Hanno Mueller hmueller@kabel.de, Mai 21 96 */
/* The white balance is an individiual value for each */
/* quickcam. Run calibration once, write the value down */
@@ -227,19 +247,21 @@ qc_calibrate(struct qcam *q)
/* recalibrate your camera again. */
{
int value;
+
#ifdef DEBUG
int count = 0;
#endif
- qc_command(q, 27); /* AutoAdjustOffset */
- qc_command(q, 0); /* Dummy Parameter, ignored by the camera */
+ qc_command (q, 27); /* AutoAdjustOffset */
+ qc_command (q, 0); /* Dummy Parameter, ignored by the camera */
/* GetOffset (33) will read 255 until autocalibration */
/* is finished. After that, a value of 1-254 will be */
/* returned. */
do {
- qc_command(q, 33); value = qc_readparam(q);
+ qc_command (q, 33);
+ value = qc_readparam (q);
#ifdef DEBUG
count++;
#endif
@@ -248,15 +270,15 @@ qc_calibrate(struct qcam *q)
q->whitebal = value;
#ifdef DEBUG
- fprintf(stderr, "%d loops to calibrate\n", count);
- fprintf(stderr, "Calibrated to %d\n", value);
+ fprintf (stderr, "%d loops to calibrate\n", count);
+ fprintf (stderr, "Calibrated to %d\n", value);
#endif
return value;
}
int
-qc_forceunidir(struct qcam *q)
+qc_forceunidir (struct qcam *q)
{
q->port_mode = (q->port_mode & ~QC_FORCE_MASK) | QC_FORCE_UNIDIR;
return 0;
@@ -266,29 +288,29 @@ qc_forceunidir(struct qcam *q)
/* Initialize the QuickCam driver control structure. This is where
* defaults are set for people who don't have a config file.*/
struct qcam *
-qc_init(void)
+qc_init (void)
{
struct qcam *q;
- q=malloc(sizeof(struct qcam));
+ q = malloc (sizeof (struct qcam));
- q->port=0; /* Port 0 == Autoprobe */
- q->port_mode=(QC_ANY | QC_NOTSET);
- q->width=160;
- q->height=120;
- q->bpp=4;
+ q->port = 0; /* Port 0 == Autoprobe */
+ q->port_mode = (QC_ANY | QC_NOTSET);
+ q->width = 160;
+ q->height = 120;
+ q->bpp = 4;
q->transfer_scale = 2;
- q->contrast=104;
- q->brightness=150;
- q->whitebal=150;
+ q->contrast = 104;
+ q->brightness = 150;
+ q->whitebal = 150;
q->top = 1;
q->left = 14;
q->mode = -1;
- q->fd=-1; /* added initialization of fd member
- * BTW, there doesn't seem to be a place to close this fd...
- * I think we need a qc_free function.
- * - Dave Plonka (plonka@carroll1.cc.edu)
- */
+ q->fd = -1; /* added initialization of fd member
+ * BTW, there doesn't seem to be a place to close this fd...
+ * I think we need a qc_free function.
+ * - Dave Plonka (plonka@carroll1.cc.edu)
+ */
return q;
}
@@ -301,21 +323,22 @@ qc_init(void)
* Returns 0 for success, 1 for opening error, 2 for locking error,
* and 3 for qcam not found */
-int qc_open(struct qcam *q)
+int
+qc_open (struct qcam *q)
{
- if(q->port==0)
- if(qc_probe(q)) {
- fprintf(stderr,"Qcam not found\n");
+ if (q->port == 0)
+ if (qc_probe (q)) {
+ fprintf (stderr, "Qcam not found\n");
return 3;
}
- if(qc_lock(q)) {
- fprintf(stderr,"Cannot lock qcam.\n");
+ if (qc_lock (q)) {
+ fprintf (stderr, "Cannot lock qcam.\n");
return 2;
}
- if(enable_ports(q)) {
- fprintf(stderr,"Cannot open QuickCam -- permission denied.");
+ if (enable_ports (q)) {
+ fprintf (stderr, "Cannot open QuickCam -- permission denied.");
return 1;
} else {
return 0;
@@ -326,11 +349,12 @@ int qc_open(struct qcam *q)
/* qc_close closes and unlocks the driver. You *need* to call this,
* or lockfiles will be left behind and everything will be screwed. */
-int qc_close(struct qcam *q)
+int
+qc_close (struct qcam *q)
{
- qc_unlock(q);
+ qc_unlock (q);
- disable_ports(q);
+ disable_ports (q);
return 0;
}
@@ -340,43 +364,46 @@ int qc_close(struct qcam *q)
* or arguments to commands, so the name fits, but it still bugs me a
* bit. See the documentation for a list of commands. */
-static int qc_command(const struct qcam *q, int command)
+static int
+qc_command (const struct qcam *q, int command)
{
int n1, n2;
int cmd;
- write_lpdata(q, command);
- write_lpcontrol(q,6);
+ write_lpdata (q, command);
+ write_lpcontrol (q, 6);
- n1 = qc_waithand(q,1);
+ n1 = qc_waithand (q, 1);
- write_lpcontrol(q,0xe);
- n2 = qc_waithand(q,0);
+ write_lpcontrol (q, 0xe);
+ n2 = qc_waithand (q, 0);
cmd = (n1 & 0xf0) | ((n2 & 0xf0) >> 4);
#ifdef DEBUG
if (cmd != command) {
- fprintf(stderr, "Command 0x%02x sent, 0x%02x echoed", command, cmd);
- n2 = read_lpstatus(q);
+ fprintf (stderr, "Command 0x%02x sent, 0x%02x echoed", command, cmd);
+ n2 = read_lpstatus (q);
cmd = (n1 & 0xf0) | ((n2 & 0xf0) >> 4);
- if (cmd != command) fprintf(stderr, " (re-read does not help)\n");
- else fprintf(stderr, " (fixed on re-read)\n");
+ if (cmd != command)
+ fprintf (stderr, " (re-read does not help)\n");
+ else
+ fprintf (stderr, " (fixed on re-read)\n");
}
#endif
return cmd;
}
static int
-qc_readparam(const struct qcam *q)
+qc_readparam (const struct qcam *q)
{
int n1, n2;
int cmd;
- write_lpcontrol(q,6);
- n1 = qc_waithand(q,1);
+ write_lpcontrol (q, 6);
+ n1 = qc_waithand (q, 1);
- write_lpcontrol(q,0xe);
- n2 = qc_waithand(q,0);
+ write_lpcontrol (q, 0xe);
+ n2 = qc_waithand (q, 0);
cmd = (n1 & 0xf0) | ((n2 & 0xf0) >> 4);
return cmd;
@@ -385,16 +412,15 @@ qc_readparam(const struct qcam *q)
/* qc_waithand busy-waits for a handshake signal from the QuickCam.
* Almost all communication with the camera requires handshaking. */
-static int qc_waithand(const struct qcam *q, int val)
+static int
+qc_waithand (const struct qcam *q, int val)
{
int status;
if (val)
- while(! ((status = read_lpstatus(q))&8))
- ;
+ while (!((status = read_lpstatus (q)) & 8));
else
- while (((status = read_lpstatus(q))&8))
- ;
+ while (((status = read_lpstatus (q)) & 8));
return status;
}
@@ -405,12 +431,13 @@ static int qc_waithand(const struct qcam *q, int val)
* since this data is useful. */
static unsigned int
-qc_waithand2(const struct qcam *q, int val)
+qc_waithand2 (const struct qcam *q, int val)
{
unsigned int status;
+
do {
- status = read_lpdata(q);
- } while ( (status & 1) != val);
+ status = read_lpdata (q);
+ } while ((status & 1) != val);
return status;
}
@@ -423,27 +450,29 @@ qc_waithand2(const struct qcam *q, int val)
almost completely safe, while their method screws up my printer if
I plug it in before the camera. */
-int qc_detect(const struct qcam *q)
+int
+qc_detect (const struct qcam *q)
{
- int reg,lastreg;
- int count=0;
+ int reg, lastreg;
+ int count = 0;
int i;
- lastreg=reg=read_lpstatus(q)&0xf0;
+ lastreg = reg = read_lpstatus (q) & 0xf0;
- for(i=0;i<30;i++) {
- reg=read_lpstatus(q)&0xf0;
- if(reg!=lastreg) count++;
- lastreg=reg;
- usleep(10000);
+ for (i = 0; i < 30; i++) {
+ reg = read_lpstatus (q) & 0xf0;
+ if (reg != lastreg)
+ count++;
+ lastreg = reg;
+ usleep (10000);
}
/* Be liberal in what you accept... */
- if(count>3&&count<15)
- return 1; /* found */
- else
- return 0; /* not found */
+ if (count > 3 && count < 15)
+ return 1; /* found */
+ else
+ return 0; /* not found */
}
@@ -452,10 +481,10 @@ int qc_detect(const struct qcam *q)
* check that bi-directional mode is detected right, and then
* implement bi-directional mode in qc_readbyte(). */
-void qc_reset(struct qcam *q)
+void
+qc_reset (struct qcam *q)
{
- switch (q->port_mode & QC_FORCE_MASK)
- {
+ switch (q->port_mode & QC_FORCE_MASK) {
case QC_FORCE_UNIDIR:
q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_UNIDIR;
break;
@@ -465,10 +494,10 @@ void qc_reset(struct qcam *q)
break;
case QC_ANY:
- write_lpcontrol(q,0x20);
- write_lpdata(q,0x75);
+ write_lpcontrol (q, 0x20);
+ write_lpdata (q, 0x75);
- if (read_lpdata(q) != 0x75) {
+ if (read_lpdata (q) != 0x75) {
q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_BIDIR;
} else {
q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_UNIDIR;
@@ -477,15 +506,15 @@ void qc_reset(struct qcam *q)
case QC_FORCE_SERIAL:
default:
- fprintf(stderr, "Illegal port_mode %x\n", q->port_mode);
+ fprintf (stderr, "Illegal port_mode %x\n", q->port_mode);
break;
}
- /* usleep(250);*/
- write_lpcontrol(q,0xb);
- usleep(250);
- write_lpcontrol(q,0xe);
- (void)qc_setscanmode(q); /* in case port_mode changed */
+ /* usleep(250); */
+ write_lpcontrol (q, 0xb);
+ usleep (250);
+ write_lpcontrol (q, 0xe);
+ (void) qc_setscanmode (q); /* in case port_mode changed */
}
@@ -498,28 +527,43 @@ void qc_reset(struct qcam *q)
* returned. If the scan is smaller, then the rest of the image
* returned contains garbage. */
-static int qc_setscanmode(struct qcam *q)
+static int
+qc_setscanmode (struct qcam *q)
{
switch (q->transfer_scale) {
- case 1: q->mode = 0; break;
- case 2: q->mode = 4; break;
- case 4: q->mode = 8; break;
- default: return 1;
+ case 1:
+ q->mode = 0;
+ break;
+ case 2:
+ q->mode = 4;
+ break;
+ case 4:
+ q->mode = 8;
+ break;
+ default:
+ return 1;
}
switch (q->bpp) {
- case 4: break;
- case 6: q->mode+=2; break;
- default:
- fprintf(stderr,"Error: Unsupported bit depth\n");
- return 1;
+ case 4:
+ break;
+ case 6:
+ q->mode += 2;
+ break;
+ default:
+ fprintf (stderr, "Error: Unsupported bit depth\n");
+ return 1;
}
switch (q->port_mode & QC_MODE_MASK) {
- case QC_BIDIR: q->mode += 1; break;
- case QC_NOTSET:
- case QC_UNIDIR: break;
- default: return 1;
+ case QC_BIDIR:
+ q->mode += 1;
+ break;
+ case QC_NOTSET:
+ case QC_UNIDIR:
+ break;
+ default:
+ return 1;
}
return 0;
}
@@ -528,44 +572,51 @@ static int qc_setscanmode(struct qcam *q)
/* Reset the QuickCam and program for brightness, contrast,
* white-balance, and resolution. */
-void qc_set(struct qcam *q)
+void
+qc_set (struct qcam *q)
{
int val;
int val2;
- qc_reset(q);
+ qc_reset (q);
/* Set the brightness. Yes, this is repetitive, but it works.
* Shorter versions seem to fail subtly. Feel free to try :-). */
/* I think the problem was in qc_command, not here -- bls */
- qc_command(q,0xb);
- qc_command(q,q->brightness);
+ qc_command (q, 0xb);
+ qc_command (q, q->brightness);
val = q->height / q->transfer_scale;
- qc_command(q,0x11); qc_command(q, val);
+ qc_command (q, 0x11);
+ qc_command (q, val);
if ((q->port_mode & QC_MODE_MASK) == QC_UNIDIR && q->bpp == 6) {
/* The normal "transfers per line" calculation doesn't seem to work
- as expected here (and yet it works fine in qc_scan). No idea
- why this case is the odd man out. Fortunately, Laird's original
- working version gives me a good way to guess at working values.
- -- bls */
+ as expected here (and yet it works fine in qc_scan). No idea
+ why this case is the odd man out. Fortunately, Laird's original
+ working version gives me a good way to guess at working values.
+ -- bls */
val = q->width;
val2 = q->transfer_scale * 4;
} else {
val = q->width * q->bpp;
- val2 = (((q->port_mode & QC_MODE_MASK) == QC_BIDIR)?24:8) *
+ val2 = (((q->port_mode & QC_MODE_MASK) == QC_BIDIR) ? 24 : 8) *
q->transfer_scale;
}
val = (val + val2 - 1) / val2;
- qc_command(q,0x13); qc_command(q, val);
+ qc_command (q, 0x13);
+ qc_command (q, val);
/* I still don't know what these do! */
/* They're setting top and left -- bls */
- qc_command(q,0xd); qc_command(q,q->top);
- qc_command(q,0xf); qc_command(q,q->left/2);
+ qc_command (q, 0xd);
+ qc_command (q, q->top);
+ qc_command (q, 0xf);
+ qc_command (q, q->left / 2);
- qc_command(q,0x19); qc_command(q,q->contrast);
- qc_command(q,0x1f); qc_command(q,q->whitebal);
+ qc_command (q, 0x19);
+ qc_command (q, q->contrast);
+ qc_command (q, 0x1f);
+ qc_command (q, q->whitebal);
}
@@ -573,9 +624,8 @@ void qc_set(struct qcam *q)
the supplied buffer. It returns the number of bytes read,
or -1 on error. */
-static int
-__inline__
-qc_readbytes(const struct qcam *q, char buffer[])
+static int __inline__
+qc_readbytes (const struct qcam *q, char buffer[])
{
int ret;
unsigned int hi, lo;
@@ -585,84 +635,90 @@ qc_readbytes(const struct qcam *q, char buffer[])
if (buffer == NULL) {
state = 0;
- return 0;
+ return 0;
}
switch (q->port_mode & QC_MODE_MASK) {
- case QC_BIDIR: /* Bi-directional Port */
- write_lpcontrol(q, 0x26);
- lo = (qc_waithand2(q, 1) >> 1);
- hi = (read_lpstatus(q) >> 3) & 0x1f;
- write_lpcontrol(q, 0x2e);
- lo2 = (qc_waithand2(q, 0) >> 1);
- hi2 = (read_lpstatus(q) >> 3) & 0x1f;
- switch (q->bpp) {
- case 4:
- buffer[0] = lo & 0xf;
- buffer[1] = ((lo & 0x70) >> 4) | ((hi & 1) << 3);
- buffer[2] = (hi & 0x1e) >> 1;
- buffer[3] = lo2 & 0xf;
- buffer[4] = ((lo2 & 0x70) >> 4) | ((hi2 & 1) << 3);
- buffer[5] = (hi2 & 0x1e) >> 1;
- ret = 6;
- break;
- case 6:
- buffer[0] = lo & 0x3f;
- buffer[1] = ((lo & 0x40) >> 6) | (hi << 1);
- buffer[2] = lo2 & 0x3f;
- buffer[3] = ((lo2 & 0x40) >> 6) | (hi2 << 1);
- ret = 4;
- break;
- default:
- fprintf(stderr, "Bad bidir pixel depth %d\n", q->bpp);
- ret = -1;
- break;
- }
- break;
-
- case QC_UNIDIR: /* Unidirectional Port */
- write_lpcontrol(q,6);
- lo = (qc_waithand(q,1) & 0xf0) >> 4;
- write_lpcontrol(q,0xe);
- hi = (qc_waithand(q,0) & 0xf0) >> 4;
-
- switch (q->bpp) {
- case 4:
- buffer[0] = lo;
- buffer[1] = hi;
- ret = 2;
- break;
- case 6:
- switch (state) {
- case 0:
- buffer[0] = (lo << 2) | ((hi & 0xc) >> 2);
- saved_bits = (hi & 3) << 4;
- state = 1; ret = 1; break;
- case 1:
- buffer[0] = lo | saved_bits;
- saved_bits = hi << 2;
- state = 2; ret = 1; break;
- case 2:
- buffer[0] = ((lo & 0xc) >> 2) | saved_bits;
- buffer[1] = ((lo & 3) << 4) | hi;
- state = 0; ret = 2; break;
- default:
- fprintf(stderr, "Unidir 6-bit state %d?\n", state);
- ret = -1;
- break;
- }
- break;
- default:
- fprintf(stderr, "Bad unidir pixel depth %d\n", q->bpp);
- ret = -1;
- break;
- }
- break;
- case QC_SERIAL: /* Serial Interface. Just in case.*/
- default:
- fprintf(stderr,"Mode %x not supported\n",q->port_mode);
- ret=-1;
- break;
+ case QC_BIDIR: /* Bi-directional Port */
+ write_lpcontrol (q, 0x26);
+ lo = (qc_waithand2 (q, 1) >> 1);
+ hi = (read_lpstatus (q) >> 3) & 0x1f;
+ write_lpcontrol (q, 0x2e);
+ lo2 = (qc_waithand2 (q, 0) >> 1);
+ hi2 = (read_lpstatus (q) >> 3) & 0x1f;
+ switch (q->bpp) {
+ case 4:
+ buffer[0] = lo & 0xf;
+ buffer[1] = ((lo & 0x70) >> 4) | ((hi & 1) << 3);
+ buffer[2] = (hi & 0x1e) >> 1;
+ buffer[3] = lo2 & 0xf;
+ buffer[4] = ((lo2 & 0x70) >> 4) | ((hi2 & 1) << 3);
+ buffer[5] = (hi2 & 0x1e) >> 1;
+ ret = 6;
+ break;
+ case 6:
+ buffer[0] = lo & 0x3f;
+ buffer[1] = ((lo & 0x40) >> 6) | (hi << 1);
+ buffer[2] = lo2 & 0x3f;
+ buffer[3] = ((lo2 & 0x40) >> 6) | (hi2 << 1);
+ ret = 4;
+ break;
+ default:
+ fprintf (stderr, "Bad bidir pixel depth %d\n", q->bpp);
+ ret = -1;
+ break;
+ }
+ break;
+
+ case QC_UNIDIR: /* Unidirectional Port */
+ write_lpcontrol (q, 6);
+ lo = (qc_waithand (q, 1) & 0xf0) >> 4;
+ write_lpcontrol (q, 0xe);
+ hi = (qc_waithand (q, 0) & 0xf0) >> 4;
+
+ switch (q->bpp) {
+ case 4:
+ buffer[0] = lo;
+ buffer[1] = hi;
+ ret = 2;
+ break;
+ case 6:
+ switch (state) {
+ case 0:
+ buffer[0] = (lo << 2) | ((hi & 0xc) >> 2);
+ saved_bits = (hi & 3) << 4;
+ state = 1;
+ ret = 1;
+ break;
+ case 1:
+ buffer[0] = lo | saved_bits;
+ saved_bits = hi << 2;
+ state = 2;
+ ret = 1;
+ break;
+ case 2:
+ buffer[0] = ((lo & 0xc) >> 2) | saved_bits;
+ buffer[1] = ((lo & 3) << 4) | hi;
+ state = 0;
+ ret = 2;
+ break;
+ default:
+ fprintf (stderr, "Unidir 6-bit state %d?\n", state);
+ ret = -1;
+ break;
+ }
+ break;
+ default:
+ fprintf (stderr, "Bad unidir pixel depth %d\n", q->bpp);
+ ret = -1;
+ break;
+ }
+ break;
+ case QC_SERIAL: /* Serial Interface. Just in case. */
+ default:
+ fprintf (stderr, "Mode %x not supported\n", q->port_mode);
+ ret = -1;
+ break;
}
return ret;
}
@@ -679,7 +735,8 @@ qc_readbytes(const struct qcam *q, char buffer[])
* n=2^(bit depth)-1. Ask me for more details if you don't understand
* this. */
-scanbuf *qc_scan(const struct qcam *q)
+scanbuf *
+qc_scan (const struct qcam * q)
{
unsigned char *ret;
int i, j, k;
@@ -692,31 +749,32 @@ scanbuf *qc_scan(const struct qcam *q)
char invert;
if (q->mode != -1) {
- qc_command(q, 0x7);
- qc_command(q, q->mode);
+ qc_command (q, 0x7);
+ qc_command (q, q->mode);
} else {
struct qcam bogus_cam;
+
/* We're going through these odd hoops to retain the "const"
- qualification on q. We can't do a qc_setscanmode directly on q,
- so we copy it, do a setscanmode on that, and pass in the newly
- computed mode. -- bls 11/21/96
- */
+ qualification on q. We can't do a qc_setscanmode directly on q,
+ so we copy it, do a setscanmode on that, and pass in the newly
+ computed mode. -- bls 11/21/96
+ */
#ifdef DEBUG
- fprintf(stderr, "Warning! qc->mode not set!\n");
+ fprintf (stderr, "Warning! qc->mode not set!\n");
#endif
bogus_cam = *q;
- (void)qc_setscanmode(&bogus_cam);
- qc_command(q, 0x7);
- qc_command(q, bogus_cam.mode);
+ (void) qc_setscanmode (&bogus_cam);
+ qc_command (q, 0x7);
+ qc_command (q, bogus_cam.mode);
}
if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) {
- write_lpcontrol(q, 0x2e); /* turn port around */
- write_lpcontrol(q, 0x26);
- (void) qc_waithand(q, 1);
- write_lpcontrol(q, 0x2e);
- (void) qc_waithand(q, 0);
+ write_lpcontrol (q, 0x2e); /* turn port around */
+ write_lpcontrol (q, 0x26);
+ (void) qc_waithand (q, 1);
+ write_lpcontrol (q, 0x2e);
+ (void) qc_waithand (q, 0);
}
/* strange -- should be 15:63 below, but 4bpp is odd */
@@ -725,23 +783,23 @@ scanbuf *qc_scan(const struct qcam *q)
linestotrans = q->height / q->transfer_scale;
pixels_per_line = q->width / q->transfer_scale;
transperline = q->width * q->bpp;
- divisor = (((q->port_mode & QC_MODE_MASK) == QC_BIDIR)?24:8) *
- q->transfer_scale;
+ divisor = (((q->port_mode & QC_MODE_MASK) == QC_BIDIR) ? 24 : 8) *
+ q->transfer_scale;
transperline = (transperline + divisor - 1) / divisor;
- ret = malloc(linestotrans * pixels_per_line);
- assert(ret);
+ ret = malloc (linestotrans * pixels_per_line);
+ assert (ret);
#ifdef DEBUG
- fprintf(stderr, "%s %d bpp\n%d lines of %d transfers each\n",
- ((q->port_mode & QC_MODE_MASK) == QC_BIDIR)?"Bidir":"Unidir",
- q->bpp, linestotrans, transperline);
+ fprintf (stderr, "%s %d bpp\n%d lines of %d transfers each\n",
+ ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) ? "Bidir" : "Unidir",
+ q->bpp, linestotrans, transperline);
#endif
for (i = 0; i < linestotrans; i++) {
for (pixels_read = j = 0; j < transperline; j++) {
- bytes = qc_readbytes(q, buffer);
- assert(bytes > 0);
+ bytes = qc_readbytes (q, buffer);
+ assert (bytes > 0);
for (k = 0; k < bytes && (pixels_read + k) < pixels_per_line; k++) {
assert (buffer[k] <= invert);
assert (buffer[k] >= 0);
@@ -750,18 +808,18 @@ scanbuf *qc_scan(const struct qcam *q)
must be 0-15 -- bls */
buffer[k] = 16;
}
- ret[i*pixels_per_line + pixels_read + k] = invert - buffer[k];
+ ret[i * pixels_per_line + pixels_read + k] = invert - buffer[k];
}
pixels_read += bytes;
}
- (void) qc_readbytes(q, 0); /* reset state machine */
+ (void) qc_readbytes (q, 0); /* reset state machine */
}
if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) {
- write_lpcontrol(q, 2);
- write_lpcontrol(q, 6);
- usleep(3);
- write_lpcontrol(q, 0xe);
+ write_lpcontrol (q, 2);
+ write_lpcontrol (q, 6);
+ usleep (3);
+ write_lpcontrol (q, 0xe);
}
return ret;
@@ -769,24 +827,23 @@ scanbuf *qc_scan(const struct qcam *q)
void
-qc_dump(const struct qcam *q, char *fname)
+qc_dump (const struct qcam *q, char *fname)
{
FILE *fp;
time_t t;
- if ((fp = fopen(fname, "w")) == 0)
- {
- fprintf(stderr, "Error: cannot open %s\n", fname);
+ if ((fp = fopen (fname, "w")) == 0) {
+ fprintf (stderr, "Error: cannot open %s\n", fname);
return;
}
- fprintf(fp, "# Version 0.9\n");
- time(&t);
- fprintf(fp, "# Created %s", ctime(&t));
- fprintf(fp, "Width %d\nHeight %d\n", q->width, q->height);
- fprintf(fp, "Top %d\nLeft %d\n", q->top, q->left);
- fprintf(fp, "Bpp %d\nContrast %d\n", q->bpp, q->contrast);
- fprintf(fp, "Brightness %d\nWhitebal %d\n", q->brightness, q->whitebal);
- fprintf(fp, "Port 0x%x\nScale %d\n", q->port, q->transfer_scale);
- fclose(fp);
+ fprintf (fp, "# Version 0.9\n");
+ time (&t);
+ fprintf (fp, "# Created %s", ctime (&t));
+ fprintf (fp, "Width %d\nHeight %d\n", q->width, q->height);
+ fprintf (fp, "Top %d\nLeft %d\n", q->top, q->left);
+ fprintf (fp, "Bpp %d\nContrast %d\n", q->bpp, q->contrast);
+ fprintf (fp, "Brightness %d\nWhitebal %d\n", q->brightness, q->whitebal);
+ fprintf (fp, "Port 0x%x\nScale %d\n", q->port, q->transfer_scale);
+ fclose (fp);
}