pilgrim_kevin 发表于 2008-08-08 16:19

嵌入式Linux打印功能的实现

  我打算实现一个嵌入式arm linux系统中的打印接口,请教一下思路。因为之前没有做过,所以概念比较模糊。具体来说,我的应用程序是一个基于Minigui的程序,系统是arm926核的CPU+ 2 FPGA的硬件架构,常用的外设接口都有,包括RS232,USB Host/Device,VGA,Ethernet等。打印机准备选用HP的,使用USB接口。

  现在我想实现的是一个简单的打印功能,比如软件中生成一个报告,按打印键打印出来。具体实现的思路是什么?我大概知道"应用程序->Ghostscript->打印任务管理模块->打印驱动"这样一个流程,但是具体的实现方式比较模糊。有相关经验的朋友,指教一下。谢谢。

------------------------------------------------------------------------------------------------------------------------------------

经过一段时间的研究,现已基本实现在arm linux里打印的功能。

首先交叉编译CUPS,这个就不细说了,configure一下即可。

先后用过两个打印机,第一个打印机HP P1008由于不支持标准的PCL,而只支持特殊的XQX Stream Protocol,最终无法搞定在板子上的文档数据转换而放弃。原因主要是:cups使用foomatic-rip做智能文档过滤器,这是一个perl程序,需要一个perl运行环境;需要调用第三方驱动foo2xqx和gs去进行数据转换,太复杂,通用性也不够(假如换打印机或支持更多打印机)。后来更换了一个支持PCL的HP打印机。

最终的实现抛开了cupsd和ghostscript,因为我的需求比较简单:打印jpeg图片。

我最终只使用了cups的两个过滤器程序imagetoraster, rastertohp,后端backend程序usb,还有打印机的PPD文件,一共只有几百K的大小。自己写脚本和程序实现打印,基本的流程如下:

imagetoraster | rastertohp | cat > /dev/usb/lp0

因为/dev/usb/lp0是独占打开的,所以这样打印会导致无法并发提交打印任务,所以自己写了个to_printer程序代替cat,其中使用简单的文件锁来产生当前有进程在打印时另外的打印进程等待的效果。

如果要支持多种复杂文档格式的打印,估计gs还是必不可少的,因为cups的过滤器也会调用gs,比如imagetops。

------------------------------------------------------------------------------------------------------------------------------------

目前针对支持HP PCL打印语言的打印机可以使用上贴的方法进行打印。如果是使用Epson的打印机,如果支持ESC/P,应该使用rastertoepson也可以实现。

上述的实现主要针对打印图片。实际上打印其他任何文档的思路应该是一样的,选择一个过滤器路径,用管道组合,比如pdftops | pstoraster | rastertohp > printer 。只是涉及到要转换到ps的状况,要调用gs。

另外,我自己实现打印过程的原因是CUPS没有彻底搞定(我这里主要是backend/usb的问题)。如果彻底搞定CUPS(配合ghostscript),那么会是一个比较理想的嵌入式Linux打印管理系统的方案。

[ 本帖最后由 pilgrim_kevin 于 2008-9-27 09:04 编辑 ]

pilgrim_kevin 发表于 2008-08-11 11:38

没有人了解吗?。。。。。。

vitoUNIX 发表于 2008-08-11 11:56

有心无力 有请帮顶!!!

rodgerluo 发表于 2008-08-11 12:27

回复 #1 pilgrim_kevin 的帖子

把你的数据写入打印机不就可以了吗?当然要了解打印机的数据格式啦!

rodgerluo 发表于 2008-08-11 12:30

回复 #1 pilgrim_kevin 的帖子

与LCD一样,你把你的输出改为打印机。

T-bagwell 发表于 2008-08-11 12:31

同楼上的回答一样
写到打印机里就可以了

pilgrim_kevin 发表于 2008-08-13 13:56

http://www.mcu361.com/Worki.asp?Id=72

我想要实现的应该是类似于这个的。

pilgrim_kevin 发表于 2008-08-14 10:52

现在完成了netpbm、cups的交叉编译,在ghostscript的交叉编译上出现了一些困难。

pilgrim_kevin 发表于 2008-08-27 16:35

楼上有几位说直接向打印机输出,目前为止是不可以的。过去老的文本打印机可以直接通过cat file > /dev/lp0 这种方式进行打印,但是如果要打印图像呢?打印复杂文档格式呢? 使用cat textfile > /dev/usb/lp0这种方式无法在我的打印机上打印文本。

也有一个思路就是将需要打印的文档转换成打印机可直接识别的数据,这种方式需要研究打印机指令语言比如HP用的PCL,太复杂了,而且有一个最大的问题是需要更换或者支持更多打印机的时候很麻烦,通用性太差。

目前我使用的打印机是USB接口的HP LaserJet P1008。在PC上可以简单地通过CUPS进行配置,打印正常,可打印pdf, image, text。我已经把CUPS/Ghostscript已经移植到ARM上,USB打印机也可正常初始化(P1008需要在加电后从上位机加载一个firmware到打印机ram里来初始化,便宜货,把存放固件的rom都省了)。现在的问题是移植的整套东西太庞大了,CUPS使用foomatic-rip进行文档过滤智能分析,但是foomatic-rip是一个perl脚本程序,我试图移植一个perl5.8.8进来,最终卡在perl的库环境的交叉编译上。而且即使可以,这些乱七八糟的东西也太庞大了。现在的思路是不使用foomatic-rip,自己配置文档过滤器,目前我只需要打印text和image文档,cups里也有texttops, imagetops, imagetoraster, rastertohp这些过滤器。正在研究中,网上能参考的资料简直太少了,希望搞过的兄弟能多指教一下。

pilgrim_kevin 发表于 2008-08-28 21:07

看来这个问题so hard:-(
页: [1] 2 3 4 5
查看完整版本: 嵌入式Linux打印功能的实现