📄 driver.h
字号:
/*===========================================================================说明: 编程环境:redhat linux9.0 gcc 适用于WIN1000,WIN3000,win6000机型 相关咨询: 青岛中科英泰科技有限公司 0532-8999087-8112 注意:对于CD109的客户显示器,固定显示2位小数,故在将数据传送到CD109_Trans函数时 请先把数据格式调成固定两位小数,如:要发送2,则送数据为2.00 yaven365@163.com weiwanjun@2004.3.12========================================================================*/extern "C" {/*=========================================================================== 顾客显示器,钱箱,打印机函数库===========================================================================*/#ifndef __DRIVER_H__#define __DRIVER_H__//#include "winteclinux.h"#define MODULE#include<linux/module.h>#include<stdio.h>#include<stdlib.h>#include<sys/io.h>#include<time.h>#include<linux/ioport.h>//#include<bios.h>#include<errno.h>#include<fcntl.h>#include<unistd.h>//#include<>#define WAITIME 3000#define DBUF 0 //发送器保持寄存器#define LSB 0 //波特率因子(LSB)#define MSB 0x1 //波特率因子(MSB)#define IER 0x1 //中断允许寄存器#define IIR 0x2 //中断标识寄存器#define LCR 0x3 //线路控制寄存器#define MCR 0x4 //MODEM控制寄存器#define LSR 0x5 //线路状态寄存器#define MSR 0x6 //MODEM状态寄存器#define PCI_Config_Address 0x0cf8#define PCI_Config_Data 0x0cfc#define BYTE unsigned char#define WORD unsigned short int#define DWORD unsigned long#define TRUE 1#define FALSE 0//extern WORD portaddress[8];//extern WORD draweraddress[2];//extern int FindCardAddress(WORD *addr, BYTE *irq, WORD *a_cfg);//extern void GetSerPortAddress(void);WORD portaddress[8]={0x3f8,0x2f8,0x3e8,0x2e8,0xac00,0xac08,0xac10,0xac18};WORD draweraddress[2]={0x9405,0x941d};BYTE Number0; //by wanjunstruct config_header /*Thisis PCI configuration space data, detail in file OXPCI954ds.pdf page15 */ { WORD DeviceID; // 0x00 WORD VendorID; WORD Command; // 0x04 WORD Status; DWORD ClassCode_RevisionID; // 0x08 WORD Reserved1; // 0x0C BYTE HeaderType; BYTE BIST; DWORD BADR[4]; // 0x10 .. 0x1C DWORD Reserved2[3]; // 0x20 .. 0x28 WORD SubsystemID; // 0x2C WORD SubsystemVendorID; DWORD Reserved3; DWORD Cap_Ptr; // 0x34 DWORD Resered4; BYTE InterruptLine; BYTE InterruptPin; WORD Reserved5; BYTE Cap_ID; BYTE Next_Ptr; WORD PMC; WORD PMCSR; WORD Reserved6;};struct config_header *PCIConfigHeader; // define a pointer for PCI configuration int FindCardAddress(WORD *addr, BYTE *irq, WORD *a_cfg){ DWORD buffer[18]; WORD DeviceNumber, FunctionNumber; WORD BusNumber, RegisterNumber; DWORD temp; WORD h; for(BusNumber=0; BusNumber<256; BusNumber++) { for(DeviceNumber=0; DeviceNumber<32; DeviceNumber++) { for(FunctionNumber=0; FunctionNumber<8; FunctionNumber++) { temp=0x80000000L; temp=temp+((DWORD)FunctionNumber<<8) + ((DWORD)DeviceNumber<<11) + ((DWORD)BusNumber<<16); outl(temp, PCI_Config_Address); temp=inl(PCI_Config_Data); if(temp!=0x0ffffffff) { h = 0; for(RegisterNumber=0; RegisterNumber<=0x44; RegisterNumber+=4) { temp=0x80000000L + (DWORD)RegisterNumber + ((DWORD)FunctionNumber<<8) + ((DWORD)DeviceNumber<<11) + ((DWORD)BusNumber<<16); outl(temp,PCI_Config_Address); buffer[h]=inl(PCI_Config_Data); h++; } if (buffer[0]==0x85011415) { (DWORD *)PCIConfigHeader = buffer; *addr = (WORD)(PCIConfigHeader->BADR[0] - 1); // Serial port base address *irq = (BYTE)PCIConfigHeader->InterruptLine; // Serial port interrupt *a_cfg = (WORD)(PCIConfigHeader->BADR[2] - 1); // PCI configuratuin base address return TRUE; } } } } } return FALSE;} //函数:GetSerPortAddress//功能:读取串口卡的地址void GetSerPortAddress(void){ WORD a,a_c; BYTE i; int cc;//by wanjun cc=FindCardAddress(&a, &i, &a_c); if (cc == 1) { if (i < 8) { Number0 = 0x08 + i; // Interrupt vector } else { Number0 = 0x070 + (i - 0x08); // Interrupt vector }; portaddress[4]=a; portaddress[5]=a+0x08; portaddress[6]=a+0x10; portaddress[7]=a+0x18; draweraddress[0]=a_c+0x05; draweraddress[1]=a_c+0x1d; }}/*=========================================================================== 串口发送指令公共函数库===========================================================================*///函数: SendChToCustdis//功能: 向客显端口输出字符//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4// c:要输出的字符//返回: 1:正常输出;-1:超时int SendChToCustdis(int iPt,char c){ int i=0; //GetSerPortAddress(); do { i++; if(i==WAITIME) break; } while (!(inw(portaddress[iPt-1]+LSR) & 0x20));if(i<WAITIME) { outw(c,portaddress[iPt-1]+DBUF); return 1; } else return -1;}//函数: SendStrToCustdis//功能: 向客显端口输出字符串//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4// c:要输出的字符;iStrLen:字符串长度//返回: 1:正常输出;-1:超时int SendStrToCustdis(int iPt,char *str,int iStrLen){ int i,iRes; for(i=0;i<iStrLen;i++) { iRes=SendChToCustdis(iPt,*str++); if(iRes==-1) break; } return iRes;}/*=========================================================================== CD109函数库 ===========================================================================*///函数: CD109_Init//功能: 初始化//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4 3,4是特殊串口地址//返回: 1:正常输出;-1:超时int CD109_Init(int iPt){// bioscom(0,0xe0|0x03|0x00|0x00,iPt-1); // 9600,8,1,n /* 设置波特率9600 */ GetSerPortAddress(); outw(0x83,portaddress[iPt-1]+LCR); outw(0,portaddress[iPt-1]+MSB); outw(0x0c,portaddress[iPt-1]+LSB); /* 设置无校验,1位停止,8位数据,禁止中断,请求发送高电平输出有效 */ outw(0x03,portaddress[iPt-1]+LCR); outw(0,portaddress[iPt-1]+IER); //禁止中断 outw(0x03,portaddress[iPt-1]+MCR); //请求发送高电平输出 return SendStrToCustdis(iPt,"\x0c",1);}//函数: CD109_CLS//功能: CD109客显清屏//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4//返回: 1:正常输出;-1:超时int CD109_CLS(int iPt){ return SendStrToCustdis(iPt,"\x0c",1);}//函数: CD109_DisStr//功能: 显示字符串//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4// str:要显示的字符串,当没有小数点时,str的长度为1到8之间,// 当有小数点时,str的长度为1到16之间。//返回: 1:正常输出;-1:超时int CD109_DisStr(int iPt,const char *str){ static char buffer[20]=""; sprintf(buffer,"\x1b\x51\x41%s\x0d",str); return SendStrToCustdis(iPt,buffer,strlen(buffer));}//函数: CD109_Trans//功能: 交易时显示相应字符和数值//参数: iPt:端口号,1:COM1,2:COM2,3:COM3,4:COM4,5:COM5,6:COM6,7:COM7,8:COM8// iTransType:交易类型,1:单价,2:合计,3:收款,4:找零;// iCurrency:币种,1:人民币,2:美元,3:港币;// strAmount:交易额//返回: 1:Success;-1:Fail//其他: 显示小数点后两位数字int CD109_Trans(int iPt,int iTransType,int iCurrencyType,const char *strAmount){char buffer[20];int iRes; if( (iPt<1) || (iPt>8) || (iTransType<1) || (iTransType>4) || //by wanjun (iCurrencyType<1) || (iCurrencyType>3) ) return -1; CD109_CLS(iPt);//"多谢惠顾" if(iTransType==4) strcpy(buffer,"\x1f\x50\x02"); else strcpy(buffer,"\x1f\x50\x01"); iRes=SendStrToCustdis(iPt,buffer,3); // 显示交易类型(单价/合计/收款/找零) sprintf(buffer,"\x1b\x73%c",iTransType); iRes=SendStrToCustdis(iPt,buffer,3);// 显示币种 sprintf(buffer,"\x1f\x73%c",iCurrencyType); iRes=SendStrToCustdis(iPt,buffer,3);//显示金额 iRes=CD109_DisStr(iPt,strAmount); return iRes;}/*=========================================================================== CD215函数库 ===========================================================================*///函数: CD215_Init//功能: 初始化CD215客显//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4,5:COMA,6:COMB//返回: 1:正常输出;-1:超时int CD215_Init(int iPt){// bioscom(0,0xe0|0x03|0x00|0x00,iPt-1); // 9600,8,1,n /* 设置波特率9600 */ //GetSerPortAddress(); outw(0x83,portaddress[iPt-1]+LCR); outw(0,portaddress[iPt-1]+MSB); outw(0x0c,portaddress[iPt-1]+LSB); /* 设置无校验,1位停止,8位数据,禁止中断,请求发送高电平输出有效 */ outw(0x03,portaddress[iPt-1]+LCR); outw(0,portaddress[iPt-1]+IER); //禁止中断 outw(0x03,portaddress[iPt-1]+MCR); //请求发送高电平输出 return SendStrToCustdis(iPt,"\x0c",1);}//函数: CD215_DisStr//功能: CD215客显显示字符串//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4// c:显示位置 'A':第一行,'B':第二行//返回: 1:正常输出;-1:超时int CD215_DisStr(int iPt,char c,char *str){ char *ws; sprintf(ws,"\x1b\x51%c%s\x0d",c,str); return SendStrToCustdis(iPt,ws,strlen(ws));}//函数: CD215_CLS//功能: CD215客显清屏//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4//返回: 1:正常输出;-1:超时int CD215_CLS(int iPt){ return SendStrToCustdis(iPt,"\x0c",1);}//函数: CD215_DisGra//功能: CD215客显图形显示//参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4,5:COM5,6:COM6,7:COM7//返回: 1:正常输出;0:超时int CD215_DisGra(int iPt,int i){ char ws[3]=""; sprintf(ws,"\x1b\x50%d",i); return SendStrToCustdis(iPt,ws,3); }/*=========================================================================== 钱箱函数库 ===========================================================================*///函数: OPENDRAWER//功能: 打开钱箱 WIN1000主板//参数: 无//返回: 无void OpenDrawer(void){ outw(0,0x220); sleep(0.2); outw(1,0x220);}//函数: CheckDrawerStatus //功能: 检查钱箱状态 WIN1000主板//参数: 无//返回: 1:关闭 0:打开int CheckDrawerStatus(void){ int iRes; if(inw(0x220)&0x01) iRes=1; else iRes=0; return iRes;}//函数: OpenMBDrawer//功能: 打开由主板控制的钱箱 WIN3000主板和WIN6000主板//参数: 无void OPENDRAWER(void){ GetSerPortAddress(); outw(0x08,draweraddress[0]); usleep(80000); outw(0x34,draweraddress[0]);}//函数:CheckMBDrawerStatus//功能:检查由主板控制的钱箱状态 WIN3000和WIN6000//参数:无//返回:1:钱箱关闭;0:钱箱打开.int CheckMBDrawerStatus(void){ int iRes; GetSerPortAddress(); if(inw(draweraddress[1])&(0x08)) iRes=0; else iRes=1; return iRes;}/*=========================================================================== 打印机函数库 ===========================================================================*///函数: OpenDev//功能: 打开并口//参数: /dev/lp0:并口1 /dev/lp1:并口2//返回值: 1:正确 -1:错误int OpenDev(char *Dev){int fd = open( Dev, O_RDWR ); //| O NOCTTY | O NDELAY if (-1 == fd) { perror("Can't Open Pal Port"); return -1; } else return fd;}//函数 : PalPrnStr//功能 : 向并口打印机发送字符串并打印//参数: fd:打印机句柄// str:要发送的字符串// len:要发送的字符串的长度//返回: 1:成功;-1:错误;int PalPrnStr(int fd,const char *str,int len){ int iRes=0; static char aBuff[1024]=""; strcpy(aBuff,str); strcat(aBuff,"\x0a"); if(write(fd,aBuff,len+1)>0) //注意:该处的fd是OpenDev的返回值,也就是并口的句柄 iRes=1; return iRes;}//函数; TM210PD_MicroFeed//功能: TM210PD打印机进纸iLines/144英寸//参数: fd:打印机端口句柄// iLines:进纸行数(0<=iLines<=255)//返回: 1:成功;-1:错误;int TM210PD_MicroFeed(int fd,int iLines){ char str[20]=""; sprintf(str,"\x1b\x4a%c",iLines&0xff); return PalPrnStr(fd,str,3);}//函数; TM210PD_FeedLines//功能: TM210PD打印机进纸iLines行//参数: fd:打印机端口句柄// iLines:进纸行数(0<=iLines<=255)//返回: 1:成功;-1:错误;int TM210PD_FeedLines(int fd,int iLines){ char str[20]=""; sprintf(str,"\x1b\x64%c",iLines&0xff); return PalPrnStr(fd,str,3);}//函数; CloseDev//功能: 关闭打印机端口句柄//参数: fd:打印机端口句柄//返回: 无void CloseDev(int fd){ close(fd);}/*=========================================================================== main(){ iopl(3); //进入内核模式 CD109_Init(5); CD109_Trans(5,1,1,"777.77");// CD215_DisStr(5, 'A', "test");// OPENDRAWER(); iopl(0); //返回用户模式 int fd=OpenDev("/dev/lp0"); //打开并口1 char buff[50]="海大新星"; PalPrnStr(fd,buff,strlen(buff)); CloseDev(fd);}===========================================================================*/#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -