- /**
- * AM1808 热敏打印机驱动
- * 支持中英文打印,提供两种16*16 24*24汉字打印
- * Lzy 2012-9-24
- */
- #include "printer.h"
- /************************************************ 步进电机控制函数 ****************************************/
- /**
- * 步进电机控制函数 二相磁历 _ucDirection -> 0:表示正转, 1:表示反转
- */
- void PrintPFPhase (int _ucDirection, int step)
- {
- int i, cw_index = 0;
- int step_in1[4]={0,1,1,0};
- int step_in2[4]={0,0,1,1};
-
- int step_in3[4]={0,0,1,1};
- int step_in4[4]={0,1,1,0};
-
- if(_ucDirection == 1)
- {
- for(i=0; i<step; i++)
- {
- spin_lock(&printer_lock); // 防止内核抢占
- if(step_in1[cw_index] == 0)
- gpio_set_value( PNT_IN_A, 0);
- else
- gpio_set_value( PNT_IN_A, 1);
-
- if(step_in2[cw_index] == 0)
- gpio_set_value( PNT_IN_B, 0);
- else
- gpio_set_value( PNT_IN_B, 1);
- spin_unlock(&printer_lock);
-
- mdelay(PrinterDelay);
-
- cw_index++;
- if(cw_index>=4)
- cw_index=0;
- }
- }
- else
- {
- for(i=0; i<step; i++)
- {
- if(step_in3[cw_index] == 0)
- gpio_set_value( PNT_IN_A, 0);
- else
- gpio_set_value( PNT_IN_A, 1);
-
- if(step_in4[cw_index] == 0)
- gpio_set_value( PNT_IN_B, 0);
- else
- gpio_set_value( PNT_IN_B, 1);
-
- mdelay(PrinterDelay);
-
- cw_index++;
- if(cw_index >= 4)
- cw_index = 0;
- }
- }
- }
- /**
- * 步进电机前进 转动一步
- */
- void Forward(int step)
- {
- PrintInit();
- PrintPFPhase(0, step);
- PrinterClose();
- }
- /**
- * 步进电机后退
- */
- void Reverse(int step)
- {
- PrintInit();
- PrintPFPhase(1, step);
- PrinterClose();
- }
- /**
- * 关闭打印机
- */
- void PrinterClose(void)
- {
- gpio_set_value( PNT_IN_A,0); // 关步进电机
- gpio_set_value( PNT_IN_B,0);
- gpio_set_value( PNT_STB1,1); // 停止加热
- gpio_set_value( PNT_STB2,1);
- gpio_set_value( PNT_PWR_ON,0); // 关电源
- }
- /**
- * 打印机初始化,返回1 成功,0 没有检测到打印纸
- */
- int PrintInit(void)
- {
- gpio_set_value( PNT_PWR_ON,1); // 开电源
- gpio_set_value( PNT_IN_A,0); // 关步进电机
- gpio_set_value( PNT_IN_B,0);
- gpio_set_value( PNT_STB1,1); // 停止加热
- gpio_set_value( PNT_STB2,1);
-
- msleep(1);
-
- return 1; // 初始化一直成功
- }
- /**
- * 配置打印机引脚为GPIO模式,并设置为输出状态,引脚置高. 关闭打印机
- */
- int PrintPortInit(void)
- {
- int i, status = 0;
-
- for(i=0; i<8; i++)
- {
- status = davinci_cfg_reg(printer_gpio_pin[i]); // 设置引脚为GPIO功能
- if (status < 0)
- {
- printk("pin could not be muxed for GPIO functionality %d\n",printer_num[i]);
- return status;
- }
-
- status = gpio_request(printer_num[i], "printer_gpio\n"); // 引脚是否已经配置成GPIO功能
- if (status < 0)
- {
- printk("ERROR can not open GPIO %d\n", printer_num[i]);
- return status;
- }
-
- gpio_direction_output(printer_num[i], 0); // 使能GPIO時钟
- gpio_set_value(printer_num[i],0); // 设置GPIO默认值为低点平
- }
-
- PrinterClose(); // 关闭打印机
-
- return status;
- }
- /**
- * 设置某个为引脚的高低电平状态
- */
- void set_gpio_biye(int port, int col)
- {
- gpio_set_value(port, col);
- }
- /**
- * 按char型格式,把一个数据输出到打印机缓冲区中
- */
- void PrintBits(unsigned int ch)
- {
- int i, len, flag;
-
- if(Font == 0)
- {
- len = 8;
- flag = 0x80;
- }
- else if(Font == 1)
- {
- len = 12;
- flag = 0x800;
- }
-
- for(i=0; i<len; i++) // 工作正式开始
- {
- SET_PT_CLK();
-
- if(ch & flag) // 先输入高位
- CLR_PT_DI();
- else
- SET_PT_DI();
-
- udelay(2);
- CLR_PT_CLK();
-
- ch <<= 1;
- udelay(1);
- }
- }
- /**
- * 打印机锁存数据,并加热
- */
- void PrintOneLineChars(void)
- {
- int gHotDelay = Hot; // 加热时间
-
- PrintPFPhase(0,Come); // 进纸
-
- /***** 数据锁存 ******/
- set_gpio_biye(PNT_LAT, 1); // 接收数据
- udelay(2);
- set_gpio_biye(PNT_LAT, 0);
- udelay(1);
-
- /********* 加热 ***************/
- set_gpio_biye(PNT_STB1, 0); // 开始加热
- mdelay(gHotDelay);
- set_gpio_biye(PNT_STB1, 1);
-
- udelay(gHotDelay); // 打印机幸苦了,需要休息
-
- set_gpio_biye(PNT_STB2, 0);
- mdelay(gHotDelay);
- set_gpio_biye(PNT_STB2, 1);
- }
-
- /**
- * 打印字符串
- */
- void PrintStr(char *str)
- {
- int i, j, k, x, line, row;
- char *ptr = str;
- int ch, lineLen, qu_code, wei_code, hz_dst;
-
- if(Font == 0) // 小号字体: 字符是16*8 汉字是16*16
- {
- row = 16;
- lineLen = 384/8; //计数一行最多有多少个字符 打印机一行有384个点,第一个字符在一行中有8个点
- }
- else if(Font == 1) // 小号字体: 字符是12*24 汉字是24*24
- {
- row = 24;
- lineLen = 384/12;
- }
- line = strlen(str)/(lineLen) + 1; // 计算字符串有占多少行 不足一行也要算一行
-
- for(k=0; k<line; k++) // 一行字
- {
- for(i=0; i<row; i++) // 一个字符由16、24行组成,需一行一行的打印
- {
- for(j=0; j<lineLen; j++)
- {
- ptr = str + j + k*lineLen;
- if(*ptr == '\0')
- break;
-
- if(*ptr < 0xa0) // 字符
- {
- if(Font == 0)
- ch = cstEnglishFontLibTable_HX16X8[((*ptr) - 0x20) * 16 + i]; // 获取点阵值
- if(Font == 1)
- ch = cstEnglishFontLibTable_24X12HX[((*ptr) - 0x20) * 24 + i]; // 获取点阵值
- PrintBits(ch); // 放入打印机缓冲区
- }
- else // 汉字
- {
- if(Font == 0)
- {
- qu_code = (*ptr) - 0xb0;
- wei_code= (*(ptr+1)) - 0xa0;
- hz_dst = qu_code*95 + wei_code;
- ch = cstChineseFontLibTable_HX16X16[hz_dst*16 + i];
- PrintBits(ch>>8); // 先输入高8位
- PrintBits(ch & 0xff);
- }
- else
- {
- if((*ptr)<0xb0)
- qu_code = (*ptr) - 0xa0;
- else
- qu_code = (*ptr) - 0xb0;
-
- wei_code = (*(ptr+1)) - 0xa0;
- hz_dst = qu_code*95 + wei_code;
-
- /// 00XX, XX,XX,以2个WORD表示,第一个WORD 高位空8BIT
- if((*ptr) < 0xb0)
- ch = cstChineseFontLibTableGBK1_24X24HX[hz_dst*24 + i];
- else
- ch = cstChineseFontLibTable_24X24HX[hz_dst*24 + i];
-
- PrintBits(ch >> 12); // 先输入高12位
- PrintBits(ch & 0xfff);
- }
- j++; // 汉字占两个字符长度
- }
- }
-
- /* 计数这行还有多少个8位没有输入到打印机缓冲区中 */
- for(x=0; x<lineLen -j; x++) // 不足一行的需要把他清空
- PrintBits(0);
-
- PrintOneLineChars(); // 打印
- }
- }
- }
- void PrintText(char *str)
- {
- PrintInit();
- PrintStr(str);
- PrinterClose();
- }
printer.tar.zip
STP388A_Spec_CN.pdf
阅读(1481) | 评论(0) | 转发(0) |