⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.h

📁 一个简单的pos机程序
💻 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 + -