1#ifndef _ACI_H_ 2#define _ACI_H_ 3 4extern int aci_port; 5extern int aci_idcode[2]; /* manufacturer and product ID */ 6extern int aci_version; /* ACI firmware version */ 7extern int aci_rw_cmd(int write1, int write2, int write3); 8 9#define aci_indexed_cmd(a, b) aci_rw_cmd(a, b, -1) 10#define aci_write_cmd(a, b) aci_rw_cmd(a, b, -1) 11#define aci_read_cmd(a) aci_rw_cmd(a,-1, -1) 12 13#define COMMAND_REGISTER (aci_port) /* write register */ 14#define STATUS_REGISTER (aci_port + 1) /* read register */ 15#define BUSY_REGISTER (aci_port + 2) /* also used for rds */ 16 17#define RDS_REGISTER BUSY_REGISTER 18 19#define ACI_SET_MUTE 0x0d 20#define ACI_SET_POWERAMP 0x0f 21#define ACI_SET_TUNERMUTE 0xa3 22#define ACI_SET_TUNERMONO 0xa4 23#define ACI_SET_IDE 0xd0 24#define ACI_SET_WSS 0xd1 25#define ACI_SET_SOLOMODE 0xd2 26#define ACI_WRITE_IGAIN 0x03 27#define ACI_WRITE_TUNE 0xa7 28#define ACI_READ_TUNERSTEREO 0xa8 29#define ACI_READ_TUNERSTATION 0xa9 30#define ACI_READ_VERSION 0xf1 31#define ACI_READ_IDCODE 0xf2 32#define ACI_INIT 0xff 33#define ACI_STATUS 0xf0 34#define ACI_S_GENERAL 0x00 35#define ACI_S_READ_IGAIN 0x21 36#define ACI_ERROR_OP 0xdf 37 38/* 39 * The following macro SCALE can be used to scale one integer volume 40 * value into another one using only integer arithmetic. If the input 41 * value x is in the range 0 <= x <= xmax, then the result will be in 42 * the range 0 <= SCALE(xmax,ymax,x) <= ymax. 43 * 44 * This macro has for all xmax, ymax > 0 and all 0 <= x <= xmax the 45 * following nice properties: 46 * 47 * - SCALE(xmax,ymax,xmax) = ymax 48 * - SCALE(xmax,ymax,0) = 0 49 * - SCALE(xmax,ymax,SCALE(ymax,xmax,SCALE(xmax,ymax,x))) = SCALE(xmax,ymax,x) 50 * 51 * In addition, the rounding error is minimal and nicely distributed. 52 * The proofs are left as an exercise to the reader. 53 */ 54 55#define SCALE(xmax,ymax,x) (((x)*(ymax)+(xmax)/2)/(xmax)) 56 57 58#endif /* _ACI_H_ */ 59