Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7678881
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2012-10-08 14:54:51


点击(此处)折叠或打开

  1. /**
  2.  * AM1808 热敏打印机驱动
  3.  * 支持中英文打印,提供两种16*16 24*24汉字打印
  4.  * Lzy 2012-9-24
  5.  */

  6. #include "printer.h"

  7. /************************************************ 步进电机控制函数 ****************************************/
  8. /**
  9.  * 步进电机控制函数 二相磁历 _ucDirection -> 0:表示正转, 1:表示反转
  10.  */
  11. void PrintPFPhase (int _ucDirection, int step)    
  12. {
  13.     int i, cw_index = 0;
  14.     int step_in1[4]={0,1,1,0};
  15.     int step_in2[4]={0,0,1,1};
  16.     
  17.     int step_in3[4]={0,0,1,1};
  18.     int step_in4[4]={0,1,1,0};
  19.        
  20.     if(_ucDirection == 1)    
  21.     {
  22.      for(i=0; i<step; i++)
  23.      {
  24.             spin_lock(&printer_lock); // 防止内核抢占
  25.             if(step_in1[cw_index] == 0)
  26.                 gpio_set_value( PNT_IN_A, 0);
  27.             else
  28.                 gpio_set_value( PNT_IN_A, 1);
  29.                 
  30.             if(step_in2[cw_index] == 0)
  31.                 gpio_set_value( PNT_IN_B, 0);
  32.             else
  33.                 gpio_set_value( PNT_IN_B, 1);
  34.             spin_unlock(&printer_lock);
  35.                            
  36.             mdelay(PrinterDelay);    
  37.               
  38.      cw_index++;
  39.      if(cw_index>=4)
  40.      cw_index=0;     
  41.      }
  42.     }
  43.     else
  44.     {
  45.      for(i=0; i<step; i++)
  46.      {
  47.             if(step_in3[cw_index] == 0)
  48.                 gpio_set_value( PNT_IN_A, 0);
  49.             else
  50.                 gpio_set_value( PNT_IN_A, 1);
  51.                 
  52.             if(step_in4[cw_index] == 0)
  53.                 gpio_set_value( PNT_IN_B, 0);
  54.             else
  55.                 gpio_set_value( PNT_IN_B, 1);
  56.     
  57.            mdelay(PrinterDelay);    
  58.     
  59.      cw_index++;
  60.      if(cw_index >= 4)
  61.      cw_index = 0;     
  62.      }
  63.      }
  64. }

  65. /**
  66.  * 步进电机前进 转动一步
  67. */
  68. void Forward(int step)
  69. {
  70.     PrintInit();
  71.     PrintPFPhase(0, step);     
  72.    PrinterClose();
  73. }

  74. /**
  75.  * 步进电机后退
  76.  */
  77. void Reverse(int step)
  78. {
  79.     PrintInit();
  80.     PrintPFPhase(1, step);
  81.     PrinterClose();
  82. }

  83. /**
  84.  * 关闭打印机
  85.  */
  86. void PrinterClose(void)
  87. {        
  88.     gpio_set_value( PNT_IN_A,0); // 关步进电机
  89.     gpio_set_value( PNT_IN_B,0);
  90.     gpio_set_value( PNT_STB1,1); // 停止加热
  91.     gpio_set_value( PNT_STB2,1);
  92.     gpio_set_value( PNT_PWR_ON,0); // 关电源
  93. }

  94. /**
  95.  * 打印机初始化,返回1 成功,0 没有检测到打印纸
  96.  */
  97. int PrintInit(void)
  98. {
  99.     gpio_set_value( PNT_PWR_ON,1); // 开电源
  100.     gpio_set_value( PNT_IN_A,0); // 关步进电机
  101.     gpio_set_value( PNT_IN_B,0);
  102.     gpio_set_value( PNT_STB1,1); // 停止加热
  103.     gpio_set_value( PNT_STB2,1);
  104.      
  105.     msleep(1);
  106.     
  107.     return 1; // 初始化一直成功
  108. }

  109. /**
  110.  * 配置打印机引脚为GPIO模式,并设置为输出状态,引脚置高. 关闭打印机
  111.  */
  112. int PrintPortInit(void)
  113. {
  114.     int i, status = 0;
  115.     
  116.     for(i=0; i<8; i++)
  117.     {
  118.         status = davinci_cfg_reg(printer_gpio_pin[i]); // 设置引脚为GPIO功能
  119.         if (status < 0)
  120.         {
  121.             printk("pin could not be muxed for GPIO functionality %d\n",printer_num[i]);
  122.             return status;
  123.         }
  124.        
  125.         status = gpio_request(printer_num[i], "printer_gpio\n"); // 引脚是否已经配置成GPIO功能
  126.         if (status < 0)
  127.         {
  128.             printk("ERROR can not open GPIO %d\n", printer_num[i]);
  129.             return status;
  130.         }
  131.         
  132.         gpio_direction_output(printer_num[i], 0); // 使能GPIO時钟
  133.         gpio_set_value(printer_num[i],0); // 设置GPIO默认值为低点平
  134.     }
  135.     
  136.     PrinterClose(); // 关闭打印机
  137.     
  138.     return status;
  139. }


  140. /**
  141.  * 设置某个为引脚的高低电平状态
  142.  */
  143. void set_gpio_biye(int port, int col)
  144. {
  145.      gpio_set_value(port, col);
  146. }

  147. /**
  148.  * 按char型格式,把一个数据输出到打印机缓冲区中
  149.  */
  150. void PrintBits(unsigned int ch)
  151. {
  152.     int i, len, flag;
  153.     
  154.     if(Font == 0)
  155.     {
  156.         len = 8;
  157.         flag = 0x80;
  158.     }
  159.     else if(Font == 1)
  160.     {
  161.         len = 12;
  162.         flag = 0x800;
  163.     }
  164.     
  165.     for(i=0; i<len; i++) // 工作正式开始
  166.     {
  167.         SET_PT_CLK();
  168.         
  169.         if(ch & flag) // 先输入高位
  170.      CLR_PT_DI();
  171.         else     
  172.          SET_PT_DI();
  173.         
  174.         udelay(2);
  175.         CLR_PT_CLK();
  176.         
  177.         ch <<= 1;
  178.         udelay(1);
  179.     }
  180. }



  181. /**
  182.  * 打印机锁存数据,并加热
  183.  */
  184. void PrintOneLineChars(void)
  185. {
  186.     int gHotDelay = Hot; // 加热时间
  187.      
  188.     PrintPFPhase(0,Come); // 进纸
  189.      
  190.     /***** 数据锁存 ******/
  191.      set_gpio_biye(PNT_LAT, 1); // 接收数据
  192.      udelay(2);
  193.      set_gpio_biye(PNT_LAT, 0);
  194.      udelay(1);
  195.        
  196.     /********* 加热 ***************/
  197.     set_gpio_biye(PNT_STB1, 0); // 开始加热
  198.     mdelay(gHotDelay);
  199.     set_gpio_biye(PNT_STB1, 1);
  200.     
  201.     udelay(gHotDelay); // 打印机幸苦了,需要休息
  202.    
  203.     set_gpio_biye(PNT_STB2, 0);
  204.     mdelay(gHotDelay);
  205.     set_gpio_biye(PNT_STB2, 1);
  206. }

  207.   

  208. /**
  209.  * 打印字符串
  210.  */
  211. void PrintStr(char *str)
  212. {
  213.     int i, j, k, x, line, row;
  214.     char *ptr = str;
  215.     int ch, lineLen, qu_code, wei_code, hz_dst;
  216.     
  217.     if(Font == 0) // 小号字体: 字符是16*8 汉字是16*16
  218.     {
  219.        row = 16;
  220.        lineLen = 384/8; //计数一行最多有多少个字符 打印机一行有384个点,第一个字符在一行中有8个点
  221.     }
  222.     else if(Font == 1) // 小号字体: 字符是12*24 汉字是24*24
  223.     {
  224.        row = 24;
  225.        lineLen = 384/12;
  226.     }

  227.     line = strlen(str)/(lineLen) + 1; // 计算字符串有占多少行 不足一行也要算一行
  228.         
  229.     for(k=0; k<line; k++) // 一行字
  230.     {
  231.         for(i=0; i<row; i++) // 一个字符由16、24行组成,需一行一行的打印
  232.         {
  233.             for(j=0; j<lineLen; j++)
  234.             {
  235.                  ptr = str + j + k*lineLen;
  236.                  if(*ptr == '\0')
  237.                     break;
  238.                   
  239.                   if(*ptr < 0xa0) // 字符
  240.                   {
  241.                      if(Font == 0)
  242.                          ch = cstEnglishFontLibTable_HX16X8[((*ptr) - 0x20) * 16 + i]; // 获取点阵值
  243.                      if(Font == 1)
  244.                          ch = cstEnglishFontLibTable_24X12HX[((*ptr) - 0x20) * 24 + i]; // 获取点阵值
  245.                      PrintBits(ch); // 放入打印机缓冲区
  246.                   }
  247.                   else // 汉字
  248.                   {
  249.                         if(Font == 0)
  250.                         {
  251.                              qu_code = (*ptr) - 0xb0;              
  252.                              wei_code= (*(ptr+1)) - 0xa0;        
  253.                              hz_dst = qu_code*95 + wei_code;
  254.                              ch = cstChineseFontLibTable_HX16X16[hz_dst*16 + i];

  255.                              PrintBits(ch>>8); // 先输入高8位
  256.                              PrintBits(ch & 0xff);
  257.                         }
  258.                         else
  259.                         {
  260.                              if((*ptr)<0xb0)
  261.                                 qu_code = (*ptr) - 0xa0;              
  262.                              else
  263.                                 qu_code = (*ptr) - 0xb0;              
  264.                        
  265.                             wei_code = (*(ptr+1)) - 0xa0;        
  266.                             hz_dst = qu_code*95 + wei_code;
  267.                           
  268.                              /// 00XX, XX,XX,以2个WORD表示,第一个WORD 高位空8BIT
  269.                             if((*ptr) < 0xb0)
  270.                                 ch = cstChineseFontLibTableGBK1_24X24HX[hz_dst*24 + i];
  271.      else
  272.      ch = cstChineseFontLibTable_24X24HX[hz_dst*24 + i];
  273.     
  274.      PrintBits(ch >> 12); // 先输入高12位
  275.                             PrintBits(ch & 0xfff);
  276.                         }
  277.                          j++; // 汉字占两个字符长度
  278.                   }
  279.             }
  280.             
  281.             /* 计数这行还有多少个8位没有输入到打印机缓冲区中 */
  282.             for(x=0; x<lineLen -j; x++) // 不足一行的需要把他清空
  283.                 PrintBits(0);
  284.             
  285.             PrintOneLineChars(); // 打印
  286.         }
  287.      }
  288. }

  289. void PrintText(char *str)
  290. {
  291.     PrintInit();
  292.     PrintStr(str);
  293.     PrinterClose();
  294. }

 printer.tar.zip   

 STP388A_Spec_CN.pdf   

阅读(1671) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~