Recess mountable printing system
Claim Score by NHIP
Abstract
A recess-mountable printer having a housing with a top, a base, a pair of sides, a back and a front. The front of the housing has a paper ejection slot which is designed to facilitate the ejection of paper from within the housing. The housing contains a paper tray which is adapted to receive and retain paper, a printhead which is adapted to print text, data and images on the paper, and an ink supply which is adapted to provide ink to the printhead. The recess-mountable printer is designed to be operable when mounted within a recess in a television, VCR, CD player or other mounting unit.

Term
Term ended
Projected expiry passed 10 December 2019, 6.8 years ago.
- Priority
- Filed
- Published
- Projected expiry
- Today
21 claims: 1 independent, 20 dependent
- 1Broadest claimClaim Score 66, broad(NHIP)A recess-mountable printer including:a housing having at least one outer surface, the at least one outer surface including a front, the front of the housing having a media ejection slot adapted to facilitate the ejection of printable media from within the housing, and the housing containing an ejectable tray adapted to contain two or more of: (a) a supply of printable media;(b) a printhead adapted to print printable information on printable media;and (c) an ink supply adapted to provide ink to the printhead, wherein the printer is adapted to be operable when mounted within a recess in a mounting unit.
650 paragraphs in 4 sections, as filed
P-0001[0001] Continuation Application of U.S. Ser. No. 10/171,627 filed on Jun. 17, 2002
FIELD OF THE INVENTION
P-0002[0002] This invention relates to a digital printing system. More particularly, the invention relates to a recess mountable digital printing system for printing on both surfaces of a sheet of print media.
SUMMARY OF THE INVENTION
P-0003[0003] According to the invention, there is provided a digital printing system for printing on both surfaces of a sheet of print media, the printing system including:
P-0004[0004] a first print engine; and
P-0005[0005] a second print engine in an opposed, aligned relationship with the first print engine, each print engine including an inkjet printhead and a transfer roller on to which ink ejected from the printhead is deposited to be applied, in turn, on an associated surface of the print media, the transfer roller of one print engine further serving as an urging means for the transfer roller of the other print engine for urging the transfer rollers into contact with their associated surfaces of the print media.
P-0006[0006] The second print engine may be pivotally mounted with respect to the first print engine, the second print engine including a biasing means, in the form of a spring, for biasing its transfer roller into abutment with the transfer roller of the first print engine. Thus, it will be appreciated that the transfer roller of each print engine serves as a pinch roller for its opposed print engine.
P-0007[0007] One of the transfer rollers of both transfer rollers may act as an urging means for urging the sheet of print media past the transfer rollers.
P-0008[0008] At least a surface of the transfer roller of each print engine may be of a wear resistant material which is resistant to pitting, scratching or scoring. The material may be titanium nitride.
P-0009[0009] Each print engine may include a page width printhead with the transfer roller being of a similar length to the printhead.
P-0010[0010] In a further preferred embodiment, the invention provides a recess-mountable printer including:
P-0011[0011] a housing having at least one outer surface, the at least one outer surface including a front, the front of the housing having a media ejection slot adapted to facilitate the ejection of printable media from within the housing,
P-0012[0012] and the housing containing an ejectable tray adapted to contain two or more of:
P-0013[0013] (a) a supply of printable media;
P-0014[0014] (b) a printhead adapted to print printable information on printable media; and
P-0015[0015] (c) an ink supply adapted to provide ink to the printhead,
P-0016[0016] wherein the printer is adapted to be operable when mounted within a recess in a mounting unit.
P-0017[0017] In this specification, unless the context clearly indicates otherwise, the term “page width printhead” is to be understood as a printhead having a printing zone that prints one line at a time on a page, the line being parallel either to a longer edge or a shorter edge of the page. The line is printed as a whole as the page moves past the printhead and the printhead is stationary, i.e. it does not raster.
P-0018[0018] The printhead of each print engine may include an ink-ejecting means and a sealing means surrounding the ink-ejecting means. The ink-ejecting means of the printhead may be a microelectromechanical device having a plurality of inkjet nozzles.
P-0019[0019] The sealing means may be an elastomeric seal surrounding the ink-ejecting means.
P-0020[0020] When the printhead of each print engine is inoperative, it may bear against its associated transfer roller such that the sealing means seals the ink-ejecting means to inhibit evaporation of ink from the ink-ejecting means, each print engine including a displacement means for withdrawing the printhead from the transfer roller when printing is to be effected.
P-0021[0021] The displacement means may include an electromagnetically operable device. The electromagnetically operable device may be a solenoid which, to draw the printhead away from the transfer roller to enable printing to be effected, requires a first, higher current, and to hold the printhead in spaced relationship relative to the transfer means requires a second, lower current.
P-0022[0022] Each print engine may include a cleaning station, arranged upstream of the printhead, for cleaning the surface of the transfer roller. The cleaning station may include a cleaning element of an absorbent, resiliently flexible material such as a sponge, and a wiper of a resiliently flexible material arranged downstream of the cleaning element. The wiper may be of rubber.
P-0023[0023] Each print engine may provide for process color output.
P-0024[0024] The print engines may be operable substantially simultaneously to effect substantially simultaneous printing on both surfaces of the print media passing between the print engines.
BRIEF DESCRIPTION OF THE DRAWINGS
P-0025[0025] The invention is now described by way of example with reference to the accompanying drawings in which:
P-0026[0026]FIG. 1 shows a front view of a CePrint printer, in accordance with a first embodiment if the invention;
P-0027[0027]FIG. 2 shows a front view of the printer, in accordance with a second embodiment of the invention;
P-0028[0028]FIG. 3 shows a side view of the printer of FIG. 1;
P-0029[0029]FIG. 4 shows a plan view of the printer of FIG. 1;
P-0030[0030]FIG. 5 shows a side view of the printer of FIG. 2;
P-0031[0031]FIG. 6 shows a table illustrating a sustained printing rate of the printer achievable with double-buffering in the printer;
P-0032[0032]FIG. 7 shows a flowchart illustrating the conceptual data flow from application to printed page;
P-0033[0033]FIG. 8 shows a schematic, sectional plan view of the printer;
P-0034[0034]FIG. 8A shows a detailed view of the area circled in FIG. 8;
P-0035[0035]FIG. 9 shows a side view, from one side, of the printer of FIG. 8;
P-0036[0036]FIG. 10 shows a side view, from the other side, of the printer of FIG. 8;
P-0037[0037]FIG. 11 shows a schematic side view of part of the printer showing the relationship between a print engine and image transfer mechanism of the printer;
P-0038[0038]FIG. 12A shows a schematic side view of part of the devices of FIG. 11 showing the printhead in a parked, non-printing condition relative to the transfer mechanism;
P-0039[0039]FIG. 12B shows a schematic side view of the part of the devices of FIG. 11 showing the printhead in a printing condition relative to the transfer mechanism;
P-0040[0040]FIG. 13 shows a schematic side view of the arrangement of the printheads and transfer mechanisms of the double-sided printer of FIG. 2;
P-0041[0041]FIG. 14 shows a three-dimensional, exploded view of a paper drive chain of the printer;
P-0042[0042]FIG. 15 shows a three-dimensional view of the printing system of the printer;
P-0043[0043]FIG. 16 shows an enlarged, three-dimensional view of part of the printing system of FIG. 15;
P-0044[0044]FIG. 17 shows a simple encoding sample;
P-0045[0045]FIG. 18 shows a block diagram of printer controller architecture;
P-0046[0046]FIG. 19 shows a flowchart of page expansion and printing data flow;
P-0047[0047]FIG. 20 shows a block diagram of an EDRL expander unit;
P-0048[0048]FIG. 21 shows a block diagram of an EDRL stream decoder;
P-0049[0049]FIG. 22 shows a block diagram of a runlength decoder;
P-0050[0050]FIG. 23 shows a block diagram of a runlength encoder;
P-0051[0051]FIG. 24 shows a block diagram of a JPEG decoder;
P-0052[0052]FIG. 25 shows a block diagram of a halftoner/compositor unit;
P-0053[0053]FIG. 26 shows a diagram of the relationship between page widths and margins;
P-0054[0054]FIG. 27 shows a block diagram of a multi-threshold dither unit;
P-0055[0055]FIG. 28 shows a block diagram of logic of the triple-threshold dither;
P-0056[0056]FIG. 29 shows a block diagram of a speaker interface;
P-0057[0057]FIG. 30 shows a block diagram of a dual printer controller configuration;
P-0058[0058]FIG. 31 shows a schematic representation of a Memjet page width printhead;
P-0059[0059]FIG. 32 shows a schematic representation of a pod of twelve printing nozzles numbered in firing order;
P-0060[0060]FIG. 33 shows a schematic representation of the same pod with the nozzles numbered in load order;
P-0061[0061]FIG. 34 shows a schematic representation of a chromapod comprising one pod of each color;
P-0062[0062]FIG. 35 shows a schematic representation of a podgroup comprising five chromapods;
P-0063[0063]FIG. 36 shows a schematic representation of a phasegroup comprising two podgroups;
P-0064[0064]FIG. 37 shows a schematic representation of the relationship between segments, firegroups, phasegroups, podgroups and chromapods:
P-0065[0065]FIG. 38 shows a phase diagram of AEnable and BEnable lines during a typical printing cycle;
P-0066[0066]FIG. 39 shows a block diagram of a printhead interface;
P-0067[0067]FIG. 40 shows a block diagram of a Memjet interface;
P-0068[0068]FIG. 41 shows a flow diagram of the generation of AEnable and BEnable pulse widths;
P-0069[0069]FIG. 42 shows a block diagram of dot count logic;
P-0070[0070]FIG. 43 shows a conceptual overview of double buffering during printing of lines N and N+1;
P-0071[0071]FIG. 44 shows a block diagram of the structure of a line loader/format unit;
P-0072[0072]FIG. 45 shows a conceptual structure of a buffer;
P-0073[0073]FIG. 46 shows a block diagram of the logical structure of a buffer;
P-0074[0074]FIG. 47 shows a diagram of the structure and size of a two-layer page buffer; and
P-0075[0075]FIG. 48 shows a block diagram of a Windows 9x/NT/CE printing system with printer driver components indicated.
DETAILED DESCRIPTION OF THE DRAWINGS
P-0076[0076] 1 Introduction
P-0077[0077] The printer, in accordance with the invention, is a high-performance color printer which combines photographic-quality image reproduction with magazine-quality text reproduction. It utilizes an 8″ page-width microelectromechanical inkjet printhead which produces 1600 dots per inch (dpi) bi-level CMYK (Cyan, Magenta, Yellow, blacK). In this description the printhead technology shall be referred to as “Memjet”, and the printer shall be referred to as “CePrint”.
P-0078[0078] CePrint is conceived as an original equipment manufacture (OEM) part designed for inclusion primarily in consumer electronics (CE) devices. Intended markets include televisions, VCRs, PhotoCD players, DVD players, Hi-fi systems, Web/Internet terminals, computer monitors, and vehicle consoles. As will be described in greater detail below, it features a low-profile front panel and provides user access to paper and ink via an ejecting tray. It operates in a horizontal orientation under domestic environmental conditions.
P-0079[0079] CePrint exists in single- and double-sided versions. The single-sided version prints 30 full-color A4 or Letter pages per minute. The double-sided version prints 60 full-color pages per minute (i.e. 30 sheets per minute). Although CePrint supports both paper sizes, it is configured at time of manufacture for a specific paper size.
P-0080[0080] 1.1 Operational Overview
P-0081[0081] CePrint reproduces black text and graphics directly using bi-level black, and continuous-tone (contone) images and graphics using dithered bi-level CMYK. For practical purposes, CePrint supports a black resolution of 800 dpi, and a contone resolution of 267 pixels per inch (ppi).
P-0082[0082] CePrint is embedded in a CE device, and communicates with the CE device (host) processor via a relatively low-speed (1.5 MBytes/s) connection. CePrint relies on the host processor to render each page to the level of contone pixels and black dots. The host processor compresses each rendered page to less than 3 MB for sub-two-second delivery to the printer. CePrint decompresses and prints the page line by line at the speed of its micro-electromechanical inkjet (Memjet) printhead. CePrint contains sufficient buffer memory for two compressed pages (6 MB), allowing it to print one page while receiving the next, but does not contain sufficient buffer memory for even a single uncompressed page (119 MB).
P-0083[0083] The double-sided version of CePrint contains two printheads which operate in parallel. These printheads are fed by separate data paths, each of which replicates the logic found in the single-sided version of CePrint. The double-sided version has a correspondingly faster connection to the host processor (3 MB/s).
P-0084[0084] 2 Product Specification
P-0085[0085] Table 1 gives a summary product specification of the single-sided and double-sided versions of the CePrint unit. <tables id="TABLE-US-00001" num="1"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="294PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 1</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>CePrint Specification</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="91PT" align="left" /><colspec colname="1" colwidth="112PT" align="left" /><colspec colname="2" colwidth="91PT" align="left" /><tbody valign="top"><row><entry /><entry>single-sided version</entry><entry>double-sided version</entry></row><row><entry /><entry namest="OFFSET" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="91PT" align="left" /><colspec colname="2" colwidth="112PT" align="left" /><colspec colname="3" colwidth="91PT" align="left" /><tbody valign="top"><row><entry>dot pitch</entry><entry>1600 dpi</entry><entry /></row><row><entry>paper</entry><entry>standard A4/Letter</entry></row><row><entry>paper tray capacity</entry><entry>150 sheets</entry></row><row><entry>print speed</entry><entry>30 pages per minute</entry><entry>60 pages per minute,</entry></row><row><entry /><entry /><entry>30 sheets per minute</entry></row><row><entry>warm-up time</entry><entry>nil</entry></row><row><entry>first print time</entry><entry>2-6 seconds</entry></row><row><entry>subsequent prints</entry><entry>2 seconds/sheet</entry></row><row><entry>color model</entry><entry>32-bit CMYK process color</entry></row><row><entry>printable area</entry><entry>fall page (fall edge bleed)</entry></row><row><entry>printhead</entry><entry>page width Memjet with 54,400</entry><entry>dual printheads</entry></row><row><entry /><entry>nozzles</entry></row><row><entry>print method</entry><entry>self-cleaning transfer roller, titanium</entry><entry>dual transfer rollers</entry></row><row><entry /><entry>nitride (TiN) coated</entry></row><row><entry>size (h × w × d)</entry><entry>40 mm × 272 mm × 416 mm</entry><entry>60 mm × 272 mm × 416 mm</entry></row><row><entry>weight</entry><entry>3 kg (approx.)</entry><entry>4 kg (approx.)</entry></row><row><entry>power supply</entry><entry>5V, 4A</entry><entry>5 V, 8 A</entry></row><row><entry>ink cartridge color capacity</entry><entry>650 pages at 15% coverage</entry></row><row><entry>ink cartridge black capacity</entry><entry>900 pages at 15% coverage</entry></row><row><entry>ink cartridge size (h × w × d)</entry><entry>21 mm × 188 mm × 38 mm</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0086[0086] 3 Memjet-Based Printing
P-0087[0087] A Memjet printhead produces 1600 dpi bi-level CMYK. On low-diffusion paper, each ejected drop forms an almost perfectly circular 22.5 mm diameter dot. Dots are easily produced in isolation, allowing dispersed-dot dithering to be exploited to its fullest. Since the Memjet printhead is page-width and operates with a constant paper velocity, the four color planes are printed in perfect registration, allowing ideal dot-on-dot printing. Since there is consequently no spatial interaction between color planes, the same dither matrix is used for each color plane.
P-0088[0088] A page layout may contain a mixture of images, graphics and text. Continuous-tone (contone) images and graphics are reproduced using a stochastic dispersed-dot dither. Unlike a clustered-dot (or amplitude-modulated) dither, a dispersed-dot (or frequency-modulated) dither reproduces high spatial frequencies (i.e. image detail) almost to the limits of the dot resolution, while simultaneously reproducing lower spatial frequencies to their full color depth, when spatially integrated by the eye. A stochastic dither matrix is carefully designed to be free of objectionable low-frequency patterns when tiled across the image. As such its size typically exceeds the minimum size required to support a number of intensity levels (i.e. 16×16×8 bits for 257 intensity levels). CePrint uses a dither volume of size 64×64×3×8 bits. The volume provides an extra degree of freedom during the design of the dither by allowing a dot to change states multiple times through the intensity range, rather than just once as in a conventional dither matrix.
P-0089[0089] Human contrast sensitivity peaks at a spatial frequency of about 3 cycles per degree of visual field and then falls off logarithmically, decreasing by a factor of 100 beyond about 40 cycles per degree and becoming immeasurable beyond 60 cycles per degree. At a normal viewing distance of 12 inches (about 300 mm), this translates roughly to 200-300 cycles per inch (cpi) on the printed page, or 400-600 samples per inch according to Nyquist's theorem. Contone resolution beyond about 400 pixels per inch (ppi) is therefore of limited utility, and in fact contributes slightly to color error through the dither.
P-0090[0090] Black text and graphics are reproduced directly using bi-level black dots, and are therefore not antialiased (i.e. low-pass filtered) before being printed. Text is therefore supersampled beyond the perceptual limits discussed above, to produce smoother edges when spatially integrated by the eye. Text resolution up to about 1200 dpi continues to contribute to perceived text sharpness (assuming low-diffusion paper, of course).
P-0091[0091] 4 Page Delivery Architecture
P-0092[0092] 4.1 Page Image Sizes
P-0093[0093] CePrint prints A4 and Letter pages with full edge bleed. Corresponding page image sizes are set out in Table 2 for various spatial resolutions and color depths used in the following discussion. Note that the size of an A4 page exceeds the size of a Letter page, although the Letter page is wider. Page buffer requirements are therefore based on A4, while line buffer requirements are based on Letter. <tables id="TABLE-US-00002" num="2"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 2</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Page Image Sizes</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="63PT" align="center" /><colspec colname="2" colwidth="42PT" align="center" /><colspec colname="3" colwidth="56PT" align="center" /><colspec colname="4" colwidth="56PT" align="center" /><tbody valign="top"><row><entry>spatial resolution</entry><entry>color depth</entry><entry>A4<sup>a</sup></entry><entry>Letter<sup>b</sup></entry></row><row><entry>(pixels/inch)</entry><entry>(bits/pixel)</entry><entry>page buffer size</entry><entry>page buffer size</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="63PT" align="char" char="." /><colspec colname="2" colwidth="42PT" align="char" char="." /><colspec colname="3" colwidth="56PT" align="center" /><colspec colname="4" colwidth="56PT" align="center" /><tbody valign="top"><row><entry>1600</entry><entry>32</entry><entry> 948 MB</entry><entry> 913 MB</entry></row><row><entry>800</entry><entry>32</entry><entry> 237 MB</entry><entry> 228 MB</entry></row><row><entry>400</entry><entry>32</entry><entry>59.3 MB</entry><entry>57.1 MB</entry></row><row><entry>267</entry><entry>32</entry><entry>26.4 MB</entry><entry>25.4 MB</entry></row><row><entry>1600</entry><entry>4</entry><entry> 119 MB</entry><entry> 114 MB</entry></row><row><entry>800</entry><entry>4</entry><entry>29.6 MB</entry><entry>28.5 MB</entry></row><row><entry>1600</entry><entry>1</entry><entry>29.6 MB</entry><entry>28.5 MB</entry></row><row><entry>800</entry><entry>1</entry><entry> 7.4 MB</entry><entry> 7.1 MB</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0094[0094] 4.2 Constraints
P-0095[0095] The act of interrupting a Memjet-based printer during the printing of a page produces a visible discontinuity, so it is advantageous for the printer to receive the entire page before commencing printing, to eliminate the possibility of buffer underrun. Furthermore, if the transmission of the page from the host to the printer takes significant time in relation to the time it takes to print the page, then it is advantageous to provide two page buffers in the printer so that one page can be printed while the next is being received. If the transmission time of a page is less than its 2-second printing time, then double-buffering allows the full 30 pages/minute page rate of CePrint to be achieved.
P-0096[0096]FIG. 6 illustrates the sustained printing rate achievable with double-buffering in the printer, assuming 2-second page rendering and 2-second page transmission.
P-0097[0097] Assuming it is economic for the printer to have a maximum of only 8 MB of memory (i.e. a single 64 Mbit DRAM), then less than 4 MB is available for each page buffer in the printer, imposing a limit of less than 4 MB on the size of the page image. To allow for program and working memory in the printer, we limit this to 3 MB per page image.
P-0098[0098] Assuming the printer has only a typical low-speed connection to the host processor, then the speed of this connection is 1-2 MB/s (i.e. 2 MB/s for parallel port, 1.5 MB/s for USB, and 1 MB/s for 10Base-T Ethernet). Assuming 2-second page transmission (i.e. equal to the printing time), this imposes a limit of 2-4 MB on the size of the page image, i.e. a limit similar to that imposed by the size of the page buffer.
P-0099[0099] In practice, because the host processor and the printer can be closely coupled, a high-speed connecton between them may be feasible.
P-0100[0100] Whatever the speed of the host connection required by the single-sided version of CePrint, the double-sided version requires a connection of twice that speed.
P-0101[0101] 4.3 Page Rendering and Compression
P-0102[0102] Page rendering (or rasterization) can be split between the host processor and printer in various ways. Some printers support a full page description language (PDL) such as Postscript, and contain correspondingly sophisticated renderers. Other printers provide special support only for rendering text, to achieve high text resolution. This usually includes support for built-in or downloadable fonts. In each case the use of an embedded renderer reduces the rendering burden on the host processor and reduces the amount of data transmitted from the host processor to the printer. However, this comes at a price. These printers are more complex than they might be, and are often unable to provide full support for the graphics system of the host, through which application programs construct, render and print pages. They fail to exploit the possibly high performance of the host processor.
P-0103[0103] CePrint relies on the host processor to render pages, i.e. contone images and graphics to the pixel level, and black text and graphics to the dot level. CePrint contains only a simple rendering engine which dithers the contone data and combines the results with any foreground bi-level black text and graphics. This strategy keeps the printer simple, and independent of any page description language or graphics system. It fully exploits the high performance expected in the host processor of a multimedia CE device. The downside of this strategy is the potentially large amount of data which must be transmitted from the host processor to the printer. We therefore use compression to reduce the page image size to the 3 MB required to allow a sustained printing rate of 30 pages/minute.
P-0104[0104] An 8.3″×11.7″ A4 page has a bi-level CMYK page image size of 119 MBytes at 1600 dpi, and a contone CMYK pagesize of 59.3 MB at 400 ppi.
P-0105[0105] We use JPEG compression to compress the contone data. Although JPEG is inherently lossy, for compression ratios of 10:1 or less the loss is usually negligible. To achieve a high-quality compression ratio of less than 10:1, and to obtain an integral contone to bi-level ratio, we choose a contone resolution of 267 ppi. This yields a contone CMYK pagesize of 25.5 MB, a corresponding compression ratio of 8.5:1 to fit within the 3 MB/page limit, and a contone to bi-level ratio of 1:6 in each dimension.
P-0106[0106] A full page of black text (and/or graphics) rasterized at printer resolution (1600 dpi) yields a bi-level image of 29.6 MB. Since rasterizing text at 1600 dpi places a heavy burden on the host processor for a small gain in quality, we choose to rasterize text at 800 dpi. This yields a bi-level image of 7.4 MB, requiring a lossless compression ratio of less than 2.5:1 to fit within the 3 MB/page limit. We achieve this using a two-dimensional bi-level compression scheme similar to the compression scheme used in Group 4 Facsimile.
P-0107[0107] As long as the image and text regions of a page are non-overlapping, any combination of the two fits within the 3 MB limit. If text lies on top of a background image, then the worst case is a compressed page image size approaching 6 MB (depending on the actual text compression ratio). This fits within the printer's page buffer memory, but prevents double-buffering of pages in the printer, thereby reducing the printer's page rate by two-thirds, i.e. to 10 pages/minute.
P-0108[0108] 4.4 Page Expansion and Printing
P-0109[0109] As described above, the host processor renders contone images and graphics to the pixel level, and black text and graphics to the dot level. These are compressed by different means and transmitted together to the printer.
P-0110[0110] The printer contains two 3 MB page buffers—one for the page being received from the host, and one for the page being printed. The printer expands the compressed page as it is being printed. This expansion consists of decompressing the 267 ppi contone CMYK image data, halftoning the resulting contone pixels to 1600 dpi bi-level CMYK dots, decompressing the 800 dpi bi-level black text data, and compositing the resulting bi-level black text dots over the corresponding bi-level CMYK image dots.
P-0111[0111] The conceptual data flow from the application to the printed page is illustrated in FIG. 7.
P-0112[0112] 5 Printer Hardware
P-0113[0113] CePrint is conceived as an OEM part designed for inclusion primarily in consumer electronics (CE) devices. Intended markets include televisions, VCRs, PhotoCD players, DVD players, Hi-fi systems, Web/Internet terminals, computer monitors, and vehicle consoles. It features a low-profile front panel and provides user access to paper and ink via an ejecting tray. It operates in a horizontal orientation under domestic environmental conditions.
P-0114[0114] Because of the simplicity of the page width Memjet printhead, CePrint contains an ultra-compact print mechanism which yields an overall product height of 40 mm for the single-sided version and 60 mm for the double-sided version.
P-0115[0115] The nature of an OEM product dictates that it should be simple in style and reflect minimum dimensions for inclusion into host products. CePrint is styled to be accommodated into all of the target market products and has minimum overall dimensions of 40 mm high×272 mm wide×416 mm deep. The only cosmetic part of the product is the front fascia and front tray plastics. These can be re-styled by a manufacturer if they wish to blend CePrint with a certain piece of equipment.
P-0116[0116] Front views of the two versions of CePrint or the printer are illustrated in FIGS. 1 and 2, respectively, of the drawings and are designated generally by the reference numeral <b>10</b>. It is to be noted that, mechanically, both versions are the same, apart from the greater height of the double-sided version to accommodate a second print engine instead of a pinch roller. This will be described in greater detail below. Side and plan views of the single-sided version of CePrint are illustrated in FIGS. 3 and 4 respectively. The side view of of the double-sided version of CePrint is illustrated in FIG. 5.
P-0117[0117] CePrint <b>10</b> is a motorized A4/Letter paper tray with a removable ink cartridge and a Memjet printhead mechanism. It includes a front panel <b>12</b> housing a paper eject button <b>14</b>, a power LED <b>16</b>, an out-of-ink LED <b>18</b> and an out-of-paper LED <b>20</b>. A paper tray <b>22</b> is slidably arranged relative to the front panel <b>12</b>. When the paper tray <b>22</b> is in its “home” position, a paper output slot <b>24</b> is defined between the front panel <b>12</b> and the paper tray <b>22</b>.
P-0118[0118] The front panel <b>12</b> fronts a housing <b>26</b> containing the working parts of the printer <b>10</b>. As illustrated in 5 of the drawings, the housing <b>26</b>, in the case of the double-sided version is stepped, at 28, towards the front panel <b>12</b> (FIGS. 1 and 2) to accommodate the second print engine. The housing <b>26</b> covers a metal chassis <b>30</b> (FIG. 8), fascias, the (molded) paper tray <b>22</b>, an ink cartridge <b>32</b> (FIG. 10), three motors, a flex PCB <b>34</b> (FIG. 8A), a rigid PCB <b>36</b> (FIG. 8) and various injection moldings and smaller parts to achieve a cost effective high volume product.
P-0119[0119] The printer <b>10</b> is simple to operate, only requiring user interaction when paper or ink need replenishing as indicated by the front-panel LEDs <b>20</b> or <b>18</b>, respectively. The paper handling mechanisms are similar to current printer applications and are therefore considered reliable. In the rare event of a paper jam, the action of ejecting the paper tray allows the user to deal with the problem. The tray <b>22</b> has a sensor which retracts the tray if the tray <b>22</b> is pushed. If the tray <b>22</b> jams on the way in, this is also sensed and the tray <b>22</b> is re-ejected. This allows the user to be lazy in operating the tray <b>22</b> by just pushing it to close and protects the unit from damage should the tray <b>22</b> get knocked while in the out position. It also caters for children sticking fingers in the tray <b>22</b> while closing. Ink is replaced by inserting a new cartridge <b>32</b> into the paper tray <b>22</b> (FIG. 8) and securing it by a cam lock lever mechanism.
P-0120[0120] 5.1 Overview
P-0121[0121] The overall views of CePrint <b>10</b> are shown in FIGS. <b>8</b> to <b>10</b>. As shown in FIG. 9 the chassis <b>30</b> includes base metalwork <b>38</b> on which front roller wheels <b>40</b> of the paper tray <b>22</b> are slidable. A bracket <b>42</b> accommodates motors <b>44</b>, <b>46</b> and <b>48</b> and gears <b>50</b> and <b>52</b> for ejecting the paper tray <b>22</b> and driving a paper pick-up roller <b>54</b>.
P-0122[0122] Attached to the bracket <b>42</b> and the base metalwork <b>38</b> are two guide rails <b>56</b> that allow the molded paper tray <b>22</b> and its rear roller wheels <b>58</b> to slide forward. As described above, the tray <b>22</b> also sits on front rollers <b>40</b> and this provides a strong, low friction and steady method of ejection and retraction. The flex PCB <b>34</b> (FIG. 8A) runs from the main PCB <b>36</b> via the motors <b>44</b>, <b>46</b> and <b>48</b> to a contact molding <b>60</b> and a lightpipe area <b>62</b>. An optical sensor on the flex PCB <b>34</b> allows the tray ejector motor <b>46</b> to retract the tray <b>22</b> independently of the eject button <b>14</b> if the tray <b>22</b> is pushed when in the out position by sensing a hole in a gear wheel <b>64</b> (FIG. 9). Similarly, the tray <b>22</b> is ejected if there is any stoppage during retraction.
P-0123[0123] The contact molding <b>60</b> has a foam pad <b>66</b> that the flex PCB <b>34</b> is fixed onto and provides data and power contacts to the printhead and bus bars during printing.
P-0124[0124] A transfer roller <b>68</b> (FIG. 11) has two end caps <b>69</b> (FIG. 8A) that run in low friction bearing assemblies <b>70</b>. One of the end caps <b>69</b> has an internal gear that acts on a small gear <b>72</b> (FIG. 14) which transfers power through a reduction gear <b>74</b> to a worm drive. This is reduced further via another gear to a motor worm drive <b>76</b> mounted on an output shaft of a stepper motor <b>124</b> arranged within the transfer roller <b>68</b>. This solution for a motor drive assembly that is housed inside the transfer roller <b>68</b> saves space for future designs and mounts onto a small chassis <b>78</b> (FIG. 8A) that is attached to ink connector moldings <b>80</b>, <b>82</b>.
P-0125[0125] An ink connector <b>84</b> has four pins <b>86</b> with an ejector plate <b>88</b> and springs <b>90</b> that interfaces with the ink cartridge <b>32</b> (FIG. 10). The ink cartridge <b>32</b> is accessed via a cam lock lever and spring <b>92</b> (FIG. <b>8</b>). The ink is conducted through molded channels into a flexible four-channel hose connector <b>94</b> that interfaces with a printhead cartridge end cap <b>96</b>. The other end of the printhead cartridge has a different flexible sealing connector <b>98</b> (FIG. 8) on the end cap to allow ink to be drawn through the cartridge during assembly and effectively charge the unit and ink connector with ink in a sealed environment. The printhead and ink connector assemblies are mounted directly into the paper tray <b>22</b>.
P-0126[0126] The paper tray <b>22</b> has several standard paper handling components, namely a metal base channel <b>100</b> (FIG. 8) with low friction pads <b>102</b>, sprung by two compression springs <b>104</b> and two metal paper guides <b>106</b> with arms <b>108</b> secured by rivets. The paper is aligned to one side of the tray <b>22</b> by a spring steel clip <b>110</b>. The tray <b>22</b> is normally configured to take A4 paper, but Letter size paper is accommodated by relocating one of the paper guide assemblies <b>106</b> and clipping a plate into the paper tray <b>22</b> to provide a rear stop. The paper tray <b>22</b> can accommodate up to 150 sheets.
P-0127[0127] As is standard practice for adding paper, the metal base channel <b>100</b> is pushed down and is latched using a tray lock molding <b>112</b> and a return spring <b>114</b>. When paper has been added and the tray <b>22</b> retracted, the tray lock molding <b>112</b> is unlatched by hitting a metal return <b>116</b> in the base metalwork <b>38</b> (FIG. 9).
P-0128[0128] The printer <b>10</b> is now ready to print. When activated, the paper pick-up roller <b>54</b> is driven by a small drive gear <b>118</b> that meshes with another drive gear <b>50</b> and a normal motor <b>44</b>. The roller <b>54</b> is located to the base metalwork <b>38</b> (FIG. 9) by two heat staked retainer moldings <b>120</b> (FIG. 8). A small molding on the end of the pick-up roller <b>54</b> acts with a sensor on the flex PCB <b>34</b> to accurately position the pick-up roller <b>54</b> in a parked position so that paper and tray <b>22</b> can be withdrawn without touching it when ejecting. This accurate positioning also allows the roller <b>54</b> to feed the sheet to the transfer roller <b>68</b> (FIG. 10) with a fixed number of revolutions. As the transfer roller <b>68</b> is running at a similar speed there should be no problem with take-up of the paper. An optical sensor <b>122</b> mounted into the housing <b>26</b> finds the start of each sheet and engages a transfer motor <b>124</b> (FIG. 14), so there is no problem if for example a sheet has moved forward of the roller during any strange operations.
P-0129[0129] The main PCB <b>36</b> is mounted onto the base metalwork <b>38</b> via standard PCB standoffs <b>126</b> and is fitted with a data connector <b>128</b> and a DC connector <b>130</b>.
P-0130[0130] The front panel <b>12</b> is mounted onto the base metalwork <b>38</b> using snap details and a top metal cover <b>132</b> completes the overall product with RFI/EMI integrity via four fixings <b>134</b>.
P-0131[0131] 5.2 Printhead Assembly and Image Transfer Mechanism
P-0132[0132] The print engine is shown in greater detail in FIG. 11 and is designated generally by the reference numeral <b>140</b>. The Memjet printhead assembly is, in turn, designated by the reference numeral <b>142</b>. This represents one of the four possible ways to deploy the Memjet printhead <b>143</b> in conjunction with the ink cartridge <b>32</b> in a product such as CePrint <b>10</b>:
P-0133[0133] permanent printhead, replaceable ink cartridge (as shown in FIG. 11)
P-0134[0134] separate replaceable printhead cartridge and ink cartridge
P-0135[0135] refillable combined printhead and ink cartridge
P-0136[0136] disposable combined printhead and ink cartridge
P-0137[0137] The Memjet printhead <b>143</b> prints onto the titanium nitride (TiN) coated transfer roller <b>68</b> which rotates in an anticlockwise direction to transfer the image onto a sheet of paper <b>144</b>. The paper <b>144</b> is pressed against the transfer roller <b>68</b> by a spring-loaded rubber coated pinch roller <b>145</b> in the case of the single-sided version. As illustrated in FIG. 13, in the case of the double-sided version, the paper <b>144</b> is pressed against one of the transfer rollers <b>68</b> under the action of the opposite transfer roller <b>68</b>. After transferring the image to the paper <b>144</b> the transfer roller <b>68</b> continues past a cleaning sponge <b>146</b> and finally a rubber wiper <b>148</b>. The sponge <b>146</b> and the wiper <b>148</b> form a cleaning station for cleaning the surface of the transfer roller <b>68</b>.
P-0138[0138] While operational, the printhead assembly <b>142</b> is held off the transfer roller <b>68</b> by a solenoid <b>150</b> as shown in FIG. 12B. When not operational, the printhead assembly <b>142</b> is parked against the transfer roller <b>68</b> as shown in FIG. 12A. The printhead's integral elastomeric seal <b>152</b> seals the printhead assembly <b>142</b> and prevents the Memjet printhead <b>143</b> from drying out.
P-0139[0139] In the double-sided version of CePrint <b>10</b>, there are dual print engines <b>140</b>, each with its associated printhead assembly <b>142</b> and transfer roller <b>68</b>, mounted in opposition as illustrated in FIG. 13. The lower print engine <b>140</b> is fixed while the upper print engine <b>140</b> pivots and is sprung to press against the paper <b>144</b>. As previously described, the upper transfer roller <b>68</b> takes the place of the pinch roller <b>145</b> in the single-sided version.
P-0140[0140] The relationship between the ink cartridge <b>32</b>, printhead assembly <b>142</b> and the transfer roller <b>68</b> is shown in greater detail in FIGS. 15 and 16 of the drawings. The ink cartridge has four reservoirs <b>154</b>, <b>156</b>, <b>158</b> and <b>160</b> for cyan, magenta, yellow and black ink respectively.
P-0141[0141] Each reservoir <b>154</b>-<b>160</b> is in flow communication with a corresponding reservoir <b>164</b>-<b>170</b> in the printhead assembly <b>142</b>. These reservoirs, in turn, supply ink to a Memjet printhead chip <b>143</b> (FIG. 16) via an ink filter <b>174</b>. It is to be noted in FIG. 16 that the elastomeric capping seal <b>152</b> is arranged on both sides of the printhead chip <b>143</b> to assist in sealing when the printhead assembly <b>142</b> is parked against the transfer roller <b>68</b>.
P-0142[0142] Power is supplied to the solenoid via busbars <b>176</b>.
P-0143[0143] 6 Printer Control Protocol
P-0144[0144] This section describes the printer control protocol used between a host and CePrint <b>10</b>. It includes control and status handling as well as the actual page description.
P-0145[0145] 6.1 Control and Status
P-0146[0146] The printer control protocol defines the format and meaning of messages exchanged by the host processor and the printer <b>10</b>. The control protocol is defined independently of the transport protocol between the host processor and the printer <b>10</b>, since the transport protocol depends on the exact nature of the connection.
P-0147[0147] Each message consists of a 16-bit message code, followed by message-specific data which may be of fixed or variable size.
P-0148[0148] All integers contained in messages are encoded in big-endian byte order.
P-0149[0149] Table 3 defines command messages sent by the host processor to the printer <b>10</b>. <tables id="TABLE-US-00003" num="3"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 3</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Printer command messages</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="center" /><colspec colname="3" colwidth="140PT" align="left" /><tbody valign="top"><row><entry>command</entry><entry>message</entry><entry /></row><row><entry>message</entry><entry>code</entry><entry>description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>reset printer</entry><entry>1</entry><entry>Resets the printer to an idle state</entry></row><row><entry /><entry /><entry>(i.e. ready and not printing).</entry></row><row><entry>get printer</entry><entry>2</entry><entry>Gets the current printer status.</entry></row><row><entry>status</entry></row><row><entry>start document</entry><entry>3</entry><entry>Starts a new document.</entry></row><row><entry>start page</entry><entry>4</entry><entry>Starts the description of a new output page.</entry></row><row><entry>page band</entry><entry>5</entry><entry>Describes a band of the current output page.</entry></row><row><entry>end page</entry><entry>6</entry><entry>Ends the description of the current output page.</entry></row><row><entry>end document</entry><entry>7</entry><entry>Ends the current document.</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0150[0150] The reset printer command can be used to reset the printer to clear an error condition, and to abort printing.
P-0151[0151] The start document command is used to indicate the start of a new document. This resets the printer's page count, which is used in the double-sided version to identify odd and even pages. The end document command is simply used to indicate the end of the document.
P-0152[0152] The description of an output page consists of a page header which describes the size and resolution of the page, followed by one or more page bands which describe the actual page content. The page header is transmitted to the printer in the start page command. Each page band is transmitted to the printer in a page band command. The last page band is followed by an endpage command. The page description is described in detail in Table 4.2.
P-0153[0153] Table 4 defines response messages sent by the printer to the host processor. <tables id="TABLE-US-00004" num="4"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 4</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Printer response messages</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="63PT" align="left" /><colspec colname="2" colwidth="28PT" align="center" /><colspec colname="3" colwidth="126PT" align="left" /><tbody valign="top"><row><entry /><entry>message</entry><entry /></row><row><entry>response message</entry><entry>code</entry><entry>description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>printer status</entry><entry>8</entry><entry>Contains the current printer status</entry></row><row><entry /><entry /><entry>(as defined in Table 7).</entry></row><row><entry>page error</entry><entry>9</entry><entry>Contains the most recent page error code</entry></row><row><entry /><entry /><entry>(as defined in Table 8).</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0154[0154] A printer status message is normally sent in response to a get printer status command. However, the nature of the connection between the host processor and the printer may allow the printer to send unsolicited status messages to the host processor. Unsolicited status messages allow timely reporting of printer exceptions to the host processor, and thereby to the user, without requiring the host processor to poll the printer on a frequent basis.
P-0155[0155] A page error message is sent in response to each start page, page band and end page command.
P-0156[0156] Table 5 defines the format of the 16-bit printer status contained in the printer status message. <tables id="TABLE-US-00005" num="5"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 5</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Printer status format</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="77PT" align="left" /><colspec colname="2" colwidth="21PT" align="center" /><colspec colname="3" colwidth="119PT" align="left" /><tbody valign="top"><row><entry>field</entry><entry>bit</entry><entry>description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>ready</entry><entry>0</entry><entry>The printer is ready to receive a page.</entry></row><row><entry>printing</entry><entry>1</entry><entry>The printer is printing.</entry></row><row><entry>error</entry><entry>2</entry><entry>The printer is in an error state.</entry></row><row><entry>paper tray missing</entry><entry>3</entry><entry>The paper tray is missing.</entry></row><row><entry>paper tray empty</entry><entry>4</entry><entry>The paper tray is empty.</entry></row><row><entry>ink cartridge missing</entry><entry>5</entry><entry>The ink cartridge is missing.</entry></row><row><entry>ink cartridge empty</entry><entry>6</entry><entry>The ink cartridge is empty.</entry></row><row><entry>ink cartridge error</entry><entry>7</entry><entry>The ink cartridge is in an error state.</entry></row><row><entry>(reserved)</entry><entry>8-15</entry><entry>Reserved for future use.</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0157[0157] Table 6 defines page error codes which may be returned in a page error message. <tables id="TABLE-US-00006" num="6"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 6</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Page error codes</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="42PT" align="center" /><colspec colname="3" colwidth="112PT" align="left" /><tbody valign="top"><row><entry /><entry>error code</entry><entry>value</entry><entry>description</entry></row><row><entry /><entry namest="OFFSET" nameend="3" align="center" rowsep="1" /></row><row><entry /><entry>no error</entry><entry>0</entry><entry>No error.</entry></row><row><entry /><entry>bad signature</entry><entry>1</entry><entry>The signature is not recognized.</entry></row><row><entry /><entry>bad version</entry><entry>2</entry><entry>The version is not supported.</entry></row><row><entry /><entry>bad parameter</entry><entry>3</entry><entry>A parameter is incorrect.</entry></row><row><entry /><entry namest="OFFSET" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0158[0158] 6.2 Page Description
P-0159[0159] CePrint <b>10</b> reproduces black at full dot resolution (1600 dpi), but reproduces contone color at a somewhat lower resolution using halftoning. The page description is therefore divided into a black layer and a contone layer. The black layer is defined to composite over the contone layer.
P-0160[0160] The black layer consists of a bitmap containing a 1-bit opacity for each pixel. This black layer matte has a resolution which is an integer factor of the printer's dot resolution. The highest supported resolution is 1600 dpi, i.e. the printer's full dot resolution.
P-0161[0161] The contone layer consists of a bitmap containing a 32-bit CMYK color for each pixel. This contone image has a resolution which is an integer factor of the printer's dot resolution. The highest supported resolution is 267 ppi, i.e. one-sixth the printer's dot resolution.
P-0162[0162] The contone resolution is also typically an integer factor of the black resolution, to simplify calculations in the printer driver. This is not a requirement, however.
P-0163[0163] The black layer and the contone layer are both in compressed form for efficient transmission over the low-speed connection to the printer.
P-0164[0164] 6.2.1 Page Structure
P-0165[0165] CePrint prints with full edge bleed using an 8.5″ printhead. It imposes no margins and so has a printable page area which corresponds to the size of its paper (A4 or Letter).
P-0166[0166] The target page size is constrained by the printable page area, less the explicit (target) left and top margins specified in the page description.
P-0167[0167] 6.2.2 Page Description Format
P-0168[0168] Apart from being implicitly defined in relation to the printable page area, each page description is complete and self-contained. There is no data transmitted to the printer separately from the page description to which the page description refers.
P-0169[0169] The page description consists of a page header which describes the size and resolution of the page, followed by one or more page bands which describe the actual page content.
P-0170[0170] Table 7 shows the format of the page header. <tables id="TABLE-US-00007" num="7"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 7</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Page header format</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="35PT" align="left" /><colspec colname="3" colwidth="98PT" align="left" /><tbody valign="top"><row><entry>field</entry><entry>format</entry><entry>description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>signature</entry><entry>16-bit</entry><entry>Page header format signature.</entry></row><row><entry /><entry>integer</entry></row><row><entry>version</entry><entry>16-bit</entry><entry>Page header format version</entry></row><row><entry /><entry>integer</entry><entry>number.</entry></row><row><entry>structure size</entry><entry>16-bit</entry><entry>Size of page header.</entry></row><row><entry /><entry>integer</entry></row><row><entry>target resolution (dpi)</entry><entry>16-bit</entry><entry>Resolution of target page.</entry></row><row><entry /><entry>integer</entry><entry>This is always 1600 for</entry></row><row><entry /><entry /><entry>CePrint.</entry></row><row><entry>target page width</entry><entry>16-bit</entry><entry>Width of target page,</entry></row><row><entry /><entry>integer</entry><entry>in dots.</entry></row><row><entry>target page height</entry><entry>16-bit</entry><entry>Height of target page,</entry></row><row><entry /><entry>integer</entry><entry>in dots.</entry></row><row><entry>target left margin</entry><entry>16-bit</entry><entry>Width of target left</entry></row><row><entry /><entry>integer</entry><entry>margin, in dots.</entry></row><row><entry>target top margin</entry><entry>16-bit</entry><entry>Height of target top</entry></row><row><entry /><entry>integer</entry><entry>margin, in dots.</entry></row><row><entry>black scale factor</entry><entry>16-bit</entry><entry>Scale factor from black</entry></row><row><entry /><entry>integer</entry><entry>resolution to target resolution</entry></row><row><entry /><entry /><entry>(must be 2 or greater).</entry></row><row><entry>black page width</entry><entry>16-bit</entry><entry>Width of black page, in</entry></row><row><entry /><entry>integer</entry><entry>black pixels.</entry></row><row><entry>black page height</entry><entry>16-bit</entry><entry>Height of black page, in</entry></row><row><entry /><entry>integer</entry><entry>black pixels.</entry></row><row><entry>contone scale factor</entry><entry>16-bit</entry><entry>Scale factor from contone</entry></row><row><entry /><entry>integer</entry><entry>resolution to target resolution</entry></row><row><entry /><entry /><entry>(must be 6 or greater).</entry></row><row><entry>contone page width</entry><entry>16-bit</entry><entry>Width of contone page, in</entry></row><row><entry /><entry>integer</entry><entry>contone pixels.</entry></row><row><entry>contone page height</entry><entry>16-bit</entry><entry>Height of contone page, in</entry></row><row><entry /><entry>integer</entry><entry>contone pixels.</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0171[0171] The page header contains a signature and version which allow the printer to identify the page header format. If the signature and/or version are missing or incompatible with the printer, then the printer can reject the page.
P-0172[0172] The page header defines the resolution and size of the target page. The black and contone layers are clipped to the target page if necessary. This happens whenever the black or contone scale factors are not factors of the target page width or height.
P-0173[0173] The target left and top margins define the positioning of the target page within the printable page area.
P-0174[0174] The black layer parameters define the pixel size of the black layer, and its integer scale factor to the target resolution.
P-0175[0175] The contone layer parameters define the pixel size of the contone layer, and its integer scale factor to the target resolution.
P-0176[0176] Table 8 shows the format of the page band header. <tables id="TABLE-US-00008" num="8"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 8</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Page band header format</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="77PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="112PT" align="left" /><tbody valign="top"><row><entry>field</entry><entry>format</entry><entry>description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>signature</entry><entry>16-bit</entry><entry>Page band header format signature.</entry></row><row><entry /><entry>integer</entry></row><row><entry>version</entry><entry>16-bit</entry><entry>Page band header format version</entry></row><row><entry /><entry>integer</entry><entry>number.</entry></row><row><entry>structure size</entry><entry>16-bit</entry><entry>Size of page band header.</entry></row><row><entry /><entry>integer</entry></row><row><entry>black band height</entry><entry>16-bit</entry><entry>Height of black band, in black</entry></row><row><entry /><entry>integer</entry><entry>pixels.</entry></row><row><entry>black band data size</entry><entry>32-bit</entry><entry>Size of black band data, in bytes.</entry></row><row><entry /><entry>integer</entry></row><row><entry>contone band height</entry><entry>16-bit</entry><entry>Height of contone band, in contone</entry></row><row><entry /><entry>integer</entry><entry>pixels.</entry></row><row><entry>contone band data size</entry><entry>32-bit</entry><entry>Size of contone band data, in bytes.</entry></row><row><entry /><entry>integer</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0177[0177] The black layer parameters define the height of the black band, and the size of its compressed band data. The variable-size black band data follows the fixed-size parts of the page band header.
P-0178[0178] The contone layer parameters define the height of the contone band, and the size of its compressed page data. The variable-size contone band data follows the variable-size black band data.
P-0179[0179] Table 9 shows the format of the variable-size compressed band data which follows the page band header. <tables id="TABLE-US-00009" num="9"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 9</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Page band data format</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="63PT" align="left" /><colspec colname="2" colwidth="56PT" align="left" /><colspec colname="3" colwidth="98PT" align="left" /><tbody valign="top"><row><entry>field</entry><entry>format</entry><entry>description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>black band data</entry><entry>EDRL bytestream</entry><entry>Compressed bi-level black</entry></row><row><entry /><entry /><entry>band data.</entry></row><row><entry>contone band data</entry><entry>JPEG bytestream</entry><entry>Compressed contone CMYK</entry></row><row><entry /><entry /><entry>band data.</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0180[0180] The variable-size black band data and the variable-size contone band data are aligned to 8-byte boundaries. The size of the required padding is included in the size of the fixed-size part of the page band header structure and the variable-size black band data.
P-0181[0181] The entire page description has a target size of less than 3 MB, and a maximum size of 6 MB, in accordance with page buffer memory in the printer.
P-0182[0182] The following sections describe the format of the compressed black layer and the compressed contone layer.
P-0183[0183] 6.2.3 Bi-level Black Layer Compression
P-0184[0184] 6.2.3.1 Group 3 and 4 Facsimile Compression
P-0185[0185] The Group 3 Facsimile compression algorithm losslessly compresses bi-level data for transmission over slow and noisy telephone lines. The bi-level data represents scanned black text and graphics on a white background, and the algorithm is tuned for this class of images (it is explicitly not tuned, for example, for halftoned bi-level images). The ID Group 3 algorithm runlength-encodes each scanline and then Huffman-encodes the resulting runlengths. Runlengths in the range 0 to 63 are coded with terminating codes. Runlengths in the range 64 to 2623 are coded with make-up codes, each representing a multiple of 64, followed by a terminating code. Runlengths exceeding 2623 are coded with multiple make-up codes followed by a terminating code. The Huffman tables are fixed, but are separately tuned for black and white runs (except for make-up codes above 1728, which are common). When possible, the 2D Group 3 algorithm encodes a scanline as a set of short edge deltas (0, ±1, ±2, ±3) with reference to the previous scanline. The delta symbols are entropy-encoded (so that the zero delta symbol is only one bit long etc.) Edges within a 2D-encoded line which can't be delta-encoded are runlength-encoded, and are identified by a prefix. 1D- and 2D-encoded lines are marked differently. 1D-encoded lines are generated at regular intervals, whether actually required or not, to ensure that the decoder can recover from line noise with minimal image degradation. 2D Group 3 achieves compression ratios of up to 6:1.
P-0186[0186] The Group 4 Facsimile algorithm losslessly compresses bi-level data for transmission over error-free communications lines (i.e. the lines are truly error-free, or error-correction is done at a lower protocol level). The Group 4 algorithm is based on the 2D Group 3 algorithm, with the essential modification that since transmission is assumed to be error-free, 1D-encoded lines are no longer generated at regular intervals as an aid to error-recovery. Group 4 achieves compression ratios ranging from 20:1 to 60:1 for the CCITT set of test images.
P-0187[0187] The design goals and performance of the Group 4 compression algorithm qualify it as a compression algorithm for the bi-level black layer. However, its Huffman tables are tuned to a lower scanning resolution (100-400 dpi), and it encodes runlengths exceeding 2623 awkwardly. At 800 dpi, our maximum runlength is currently 6400. Although a Group 4 decoder core might be available for use in the printer controller chip (Section 7), it might not handle runlengths exceeding those normally encountered in 400 dpi facsimile applications, and so would require modification.
P-0188[0188] Since most of the benefit of Group 4 comes from the delta-encoding, a simpler algorithm based on delta-encoding alone is likely to meet our requirements. This approach is described in detail below.
P-0189[0189] 6.2.3.2 Bi-Level Edge Delta and Runlength (EDRL) Compression Format
P-0190[0190] The edge delta and runlength (EDRL) compression format is based loosely on the Group 4 compression format and its precursors.
P-0191[0191] EDRL uses three kinds of symbols, appropriately entropy-coded. These are create edge, kill edge, and edge delta. Each line is coded with reference to its predecessor. The predecessor of the first line is defined to a line of white. Each line is defined to start off white. If a line actually starts of black (the less likely situation), then it must define a black edge at offset zero. Each line must define an edge at its left-hand end, i.e. at offset page width.
P-0192[0192] An edge can be coded with reference to an edge in the previous line if there is an edge within the maximum delta range with the same sense (white-to-black or black-to-white). This uses one of the edge delta codes. The shorter and likelier deltas have the shorter codes. The maximum delta range (±2) is chosen to match the distribution of deltas for typical glyph edges. This distribution is mostly independent of point size. A typical example is given in Table 10. <tables id="TABLE-US-00010" num="10"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 10</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Edge delta distribution for 10 point Times at 800 dpi</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="49PT" align="left" /><colspec colname="1" colwidth="28PT" align="center" /><colspec colname="2" colwidth="140PT" align="center" /><tbody valign="top"><row><entry /><entry>|delta|</entry><entry>probability</entry></row><row><entry /><entry namest="OFFSET" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="49PT" align="left" /><colspec colname="1" colwidth="28PT" align="char" char="." /><colspec colname="2" colwidth="140PT" align="center" /><tbody valign="top"><row><entry /><entry>0</entry><entry>65%</entry></row><row><entry /><entry>1</entry><entry>23%</entry></row><row><entry /><entry>2</entry><entry> 7%</entry></row><row><entry /><entry>≧3</entry><entry> 5%</entry></row><row><entry /><entry namest="OFFSET" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0193[0193] An edge can also be coded using the length of the run from the previous edge in the same line. This uses one of the create edge codes for short (7-bit) and long (13-bit) runlengths. For simplicity, and unlike Group 4, runlengths are not entropy-coded. In order to keep edge deltas implicitly synchronized with edges in the previous line, each unused edge in the previous line is ‘killed’ when passed in the current line. This uses the kill edge code. The end-of-page code signals the end of the page to the decoder.
P-0194[0194] Note that 7-bit and 13-bit runlengths are specifically chosen to support 800 dpi A4/Letter pages. Longer runlengths could be supported without significant impact on compression performance. For example, if supporting 1600 dpi compression, the runlengths should be at least 8-bit and 14-bit respectively. A general-purpose choice might be 8-bit and 16-bit, thus supporting up to 40″ wide 1600 dpi pages.
P-0195[0195] The full set of codes is defined in Table 11. Note that there is no end-of-line code. The decoder uses the page width to detect the end of the line. The lengths of the codes are ordered by the relative probabilities of the codes' occurrence. <tables id="TABLE-US-00011" num="11"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 11</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>EDRL codewords</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="35PT" align="center" /><colspec colname="3" colwidth="42PT" align="left" /><colspec colname="4" colwidth="91PT" align="left" /><tbody valign="top"><row><entry>code</entry><entry>encoding</entry><entry>suffix</entry><entry>description</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="35PT" align="char" char="." /><colspec colname="3" colwidth="42PT" align="left" /><colspec colname="4" colwidth="91PT" align="left" /><tbody valign="top"><row><entry>Δ0</entry><entry>1</entry><entry>—</entry><entry>don't move corresponding</entry></row><row><entry /><entry /><entry /><entry>edge</entry></row><row><entry>Δ + 1</entry><entry>010</entry><entry>—</entry><entry>move corresponding edge +1</entry></row><row><entry>Δ − 1</entry><entry>011</entry><entry>—</entry><entry>move corresponding edge −1</entry></row><row><entry>Δ + 2</entry><entry>00010</entry><entry>—</entry><entry>move corresponding edge +2</entry></row><row><entry>Δ − 2</entry><entry>00011</entry><entry>—</entry><entry>move corresponding edge −2</entry></row><row><entry>kill edge</entry><entry>0010</entry><entry>—</entry><entry>kill corresponding edge</entry></row><row><entry>create near</entry><entry>0011</entry><entry>7-bit RL</entry><entry>create edge from short</entry></row><row><entry>edge</entry><entry /><entry /><entry>runlength (RL)</entry></row><row><entry>create far</entry><entry>00001</entry><entry>13-bit RL</entry><entry>create edge from long</entry></row><row><entry>edge</entry><entry /><entry /><entry>runlength (RL)</entry></row><row><entry>end-of-page</entry><entry>000001</entry><entry>—</entry><entry>end-of-page marker</entry></row><row><entry>(EOP)</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0196[0196]FIG. 17 shows a simple encoding example. Note that the common situation of an all-white line following another all-white line is encoded using a single bit (Δ0), and an all-black line following another all-black line is encoded using two bits (Δ0, Δ0).
P-0197[0197] Note that the foregoing describes the compression format, not the compression algorithm per se. A variety of equivalent encodings can be produced for the same image, some more compact than others. For example, a pure runlength encoding conforms to the compression format. The goal of the compression algorithm is to discover a good, if not the best, encoding for a given image.
P-0198[0198] The following is a simple algorithm for producing the EDRL encoding of a line with reference to its predecessor. <tables id="TABLE-US-00012" num="12"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="119PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><thead><row><entry /></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>#define SHORT_RUN_PRECISION 7</entry><entry>// precision of short run</entry></row><row><entry>#define LONG_RUN_PRECISION13</entry><entry>// precision of long run</entry></row><row><entry>EDRL_CompressLine</entry></row><row><entry>(</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>Byte prevLine[ ],</entry><entry>// previous (reference)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>// bi-level line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>Byte currLine[ ],</entry><entry>// current (coding) bi-level</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>int lineLen,</entry><entry>// line length</entry></row><row><entry /><entry>BITSTREAM s</entry><entry>// output (compressed) bitstream</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>int prevEdge = 0</entry><entry>// current edge offset in</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>// previous line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>int currEdge = 0</entry><entry>// current edge offset in</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>// current line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>int codedEdge = currEdge</entry><entry>// most recent coded (output)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>edge</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>int prevColor = 0</entry><entry>// current color in prev line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>// (0 = white)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>int currColor = 0</entry><entry>// current color in current</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="105PT" align="left" /><colspec colname="2" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>int prevRun</entry><entry>// current run in previous line</entry></row><row><entry /><entry>int currRun</entry><entry>// current run in current line</entry></row><row><entry /><entry>bool bUpdatePrevEdge = true</entry><entry>// force first edge update</entry></row><row><entry /><entry>bool bUpdateCurrEdge = true</entry><entry>// force first edge update</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>while (codedEdge < lineLen)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>// possibly update current edge in previous line</entry></row><row><entry /><entry>if (bUpdatePrevEdge)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>if (prevEdge < lineLen)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>prevRun = GetRun (prevLine,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>prevEdge, lineLen, prevColor)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>else</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>prevRun = 0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>prevEdge += prevRun</entry></row><row><entry /><entry>prevColor = !prevColor</entry></row><row><entry /><entry>bUpdatePrevEdge = false</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>// possibly update current edge in current line</entry></row><row><entry /><entry>if (bUpdateCurrEdge)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>if (currEdge < lineLen)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>currRun = GetRun (currLine,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="119PT" align="left" /><colspec colname="1" colwidth="98PT" align="left" /><tbody valign="top"><row><entry /><entry>currEdge, lineLen, currColor)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>else</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>currRun = 0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>currEdge += currRun</entry></row><row><entry /><entry>currColor = !currColor</entry></row><row><entry /><entry>bUpdateCurrEdge = false</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>// output delta whenever possible, i.e. when</entry></row><row><entry /><entry>// edge senses match, and delta is small enough</entry></row><row><entry /><entry>if (prevColor == currColor)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>delta = currEdge − prevEdge</entry></row><row><entry /><entry>if (abs (delta) <= MAX_DELTA)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>PutCode(s, EDGE_DELTA0 + delta)</entry></row><row><entry /><entry>codedEdge = currEdge</entry></row><row><entry /><entry>bUpdatePrevEdge = true</entry></row><row><entry /><entry>bUpdateCurrEdge = true</entry></row><row><entry /><entry>continue</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>// kill unmatched edge in previous line</entry></row><row><entry /><entry>if (prevEdge <= currEdge)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>PutCode(s, KILL_EDGE)</entry></row><row><entry /><entry>bUpdatePrevEdge = true</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>// create unmatched edge in current line</entry></row><row><entry /><entry>if (currEdge <= prevEdge)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>PutCode(s, CREATE_EDGE)</entry></row><row><entry /><entry>if (currRun < 128)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>PutCode(s, CREATE_NEAR_EDGE)</entry></row><row><entry /><entry>PutBits(currRun, SHORT_RUN_PRECISION)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>else</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>PutCode(s, CREATE_FAR_EDGE)</entry></row><row><entry /><entry>PutBits(currRun, LONG_RUN_PRECISION)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>codedEdge = currEdge</entry></row><row><entry /><entry>bUpdateCurrEdge = true</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row><row><entry /><entry namest="OFFSET" nameend="1" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0199[0199] For completeness the corresponding decompression algorithm is given below. It forms the core of the EDRL Expander unit in the printer controller chip (Section 7). <tables id="TABLE-US-00013" num="13"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><thead><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>EDRL DecompressLine</entry></row><row><entry>(</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>BITSTREAM s,</entry><entry>// input (compressed) bitstream</entry></row><row><entry /><entry>Byte prevLine [ ],</entry><entry>// previous (reference) bi-level line</entry></row><row><entry /><entry>Byte currLine[ ],</entry><entry>// current (coding) bi-level line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>int lineLen // line length</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>int prevEdge = 0</entry><entry>// current edge offset in</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="98PT" align="left" /><colspec colname="1" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>// previous line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>int currEdge = 0</entry><entry>// current edge offset in current line</entry></row><row><entry /><entry>int prevColor = 0</entry><entry>// current color in previous line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="98PT" align="left" /><colspec colname="1" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>// (0 = white)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>int currColor = 0</entry><entry>// current color in current line</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>while (currEdge < lineLen)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>code = GetCode(s)</entry></row><row><entry /><entry>switch (code)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>case EDGE_DELTA_MINUS2:</entry></row><row><entry /><entry>case EDGE_DELTA_MINUS1:</entry></row><row><entry /><entry>case EDGE_DELTA_0:</entry></row><row><entry /><entry>case EDGE_DELTA_PLUS1:</entry></row><row><entry /><entry>case EDGE_DELTA_PLUS2:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>// create edge from delta</entry></row><row><entry /><entry>int delta = code − EDGE_DELTA_0</entry></row><row><entry /><entry>int run = prevEdge + delta − currEdge</entry></row><row><entry /><entry>FillBitRun(currLine, currEdge, currColor, run)</entry></row><row><entry /><entry>currEdge += run</entry></row><row><entry /><entry>currColor = !currColor</entry></row><row><entry /><entry>prevEdge += GetRun (prevLine,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="98PT" align="left" /><colspec colname="1" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>prevEdge, lineLen, prevColor)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>prevColor = !prevColor</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>case KILL_EDGE:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>// discard unused reference edge</entry></row><row><entry /><entry>prevEdge += GetRun (prevLine,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="98PT" align="left" /><colspec colname="1" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>prevEdge, lineLen, prevColor)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>prevColor = !prevColor</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>case CREATE_NEAR_EDGE:</entry></row><row><entry /><entry>case CREATE_FAR_EDGE:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>// create edge explicitly</entry></row><row><entry /><entry>int run</entry></row><row><entry /><entry>if (code == CREATE_NEAR_EDGE)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>run = GetBits(s, SHORT_RUN_PRECISION)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>else</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>run = GetBits(s, LONG_RUN_PRECISION)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>FillBitRun(currLine, currEdge, currColor, run)</entry></row><row><entry /><entry>currColor = !currColor</entry></row><row><entry /><entry>currEdge += run</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0200[0200] 6.2.3.3 EDRL Compression Performance
P-0201[0201] Table 12 shows the compression performance of Group 4 and EDRL on the CCITT test documents used to select the Group 4 algorithm. Each document represents a single page scanned at 400 dpi. Groups 4's superior performance is due to its entropy-coded runlengths, tuned to 400 dpi features. <tables id="TABLE-US-00014" num="14"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 12</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Group 4 and EDRL compression performance</entry></row><row><entry>on standard CCITTT documents at 400 dpi</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="77PT" align="center" /><colspec colname="2" colwidth="63PT" align="center" /><colspec colname="3" colwidth="77PT" align="center" /><tbody valign="top"><row><entry>CCITT document</entry><entry>Group 4</entry><entry>EDRL</entry></row><row><entry>number</entry><entry>compression ratio</entry><entry>compression ratio</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="77PT" align="center" /><colspec colname="2" colwidth="63PT" align="char" char="." /><colspec colname="3" colwidth="77PT" align="char" char="." /><tbody valign="top"><row><entry>1</entry><entry>29.1</entry><entry>21.6</entry></row><row><entry>2</entry><entry>49.9</entry><entry>41.3</entry></row><row><entry>3</entry><entry>17.9</entry><entry>14.1</entry></row><row><entry>4</entry><entry>7.3</entry><entry>5.5</entry></row><row><entry>5</entry><entry>15.8</entry><entry>12.4</entry></row><row><entry>6</entry><entry>31.0</entry><entry>25.5</entry></row><row><entry>7</entry><entry>7.4</entry><entry>5.3</entry></row><row><entry>8</entry><entry>26.7</entry><entry>23.4</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0202[0202] Magazine text is typically typeset in a typeface with serifs (such as Times) at a point size of 10. At this size an A4/Letter page holds up to 14,000 characters, though a typical magazine page holds only about 7,000 characters. Text is seldom typeset at a point size smaller than 5. At 800 dpi, text cannot be meaningfully rendered at a point size lower than 2 using a standard typeface. Table 13 illustrates the legibility of various point sizes. <tables id="TABLE-US-00015" num="15"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 13</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Text at different point sizes</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="63PT" align="center" /><colspec colname="2" colwidth="154PT" align="left" /><tbody valign="top"><row><entry>point size</entry><entry>sample text (in Times)</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="63PT" align="char" char="." /><colspec colname="2" colwidth="154PT" align="left" /><tbody valign="top"><row><entry>2</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry>3</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry>4</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry>5</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry>6</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry>7</entry><entry>The quick brown fox jumps over the lazy dog</entry></row><row><entry>8</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry>9</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry>10</entry><entry>The quick brown fox jumps over the lazy dog.</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0203[0203] Table 14 shows Group 4 and EDRL compression performance on pages of text of varying point sizes, rendered at 800 dpi. Note that EDRL achieves the required compression ratio of 2.5 for an entire page of text typeset at a point size of 3. The distribution of characters on the test pages is based on English-language statistics. <tables id="TABLE-US-00016" num="16"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 14</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Group 4 and EDRL compression performance on text at 800 dpi</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="42PT" align="center" /><colspec colname="2" colwidth="35PT" align="center" /><colspec colname="3" colwidth="77PT" align="center" /><colspec colname="4" colwidth="63PT" align="center" /><tbody valign="top"><row><entry /><entry>characters/</entry><entry>Group 4 compression</entry><entry>EDRL compression</entry></row><row><entry>point size</entry><entry>A4 page</entry><entry>ratio</entry><entry>ratio</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="42PT" align="char" char="." /><colspec colname="2" colwidth="35PT" align="char" char="." /><colspec colname="3" colwidth="77PT" align="char" char="." /><colspec colname="4" colwidth="63PT" align="char" char="." /><tbody valign="top"><row><entry>2</entry><entry>340,000</entry><entry>2.3</entry><entry>1.7</entry></row><row><entry>3</entry><entry>170,000</entry><entry>3.2</entry><entry>2.5</entry></row><row><entry>4</entry><entry>86,000</entry><entry>4.7</entry><entry>3.8</entry></row><row><entry>5</entry><entry>59,000</entry><entry>5.5</entry><entry>4.9</entry></row><row><entry>6</entry><entry>41,000</entry><entry>6.5</entry><entry>6.1</entry></row><row><entry>7</entry><entry>28,000</entry><entry>7.7</entry><entry>7.4</entry></row><row><entry>8</entry><entry>21,000</entry><entry>9.1</entry><entry>9.0</entry></row><row><entry>9</entry><entry>17,000</entry><entry>10.2</entry><entry>10.4</entry></row><row><entry>10</entry><entry>14,000</entry><entry>10.9</entry><entry>11.3</entry></row><row><entry>11</entry><entry>12,000</entry><entry>11.5</entry><entry>12.4</entry></row><row><entry>12</entry><entry>8,900</entry><entry>13.5</entry><entry>14.8</entry></row><row><entry>13</entry><entry>8,200</entry><entry>13.5</entry><entry>15.0</entry></row><row><entry>14</entry><entry>7,000</entry><entry>14.6</entry><entry>16.6</entry></row><row><entry>15</entry><entry>5,800</entry><entry>16.1</entry><entry>18.5</entry></row><row><entry>20</entry><entry>3,400</entry><entry>19.8</entry><entry>23.9</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0204[0204] For a point size of 9 or greater, EDRL slightly outperforms Group 4, simply because Group 4's runlength codes are tuned to 400 dpi.
P-0205[0205] These compression results bear out the observation that entropy-encoded runlengths contribute much less to compression than 2D encoding, unless the data is poorly correlated vertically, such as in the case of very small characters.
P-0206[0206] 6.2.4 Contone Layer Compression
P-0207[0207] 6.2.4.1 JPEG Compression
P-0208[0208] The JPEG compression algorithm lossily compresses a contone image at a specified quality level. It introduces imperceptible image degradation at compression ratios below 5:1, and negligible image degradation at compression ratios below 10:1.
P-0209[0209] JPEG typically first transforms the image into a color space which separates luminance and chrominance into separate color channels. This allows the chrominance channels to be subsampled without appreciable loss because of the human visual system's relatively greater sensitivity to luminance than chrominance. After this first step, each color channel is compressed separately.
P-0210[0210] The image is divided into 8×8 pixel blocks. Each block is then transformed into the frequency domain via a discrete cosine transform (DCT). This transformation has the effect of concentrating image energy in relatively lower-frequency coefficients, which allows higher-frequency coefficients to be more crudely quantized. This quantization is the principal source of compression in JPEG. Further compression is achieved by ordering coefficients by frequency to maximize the likelihood of adjacent zero coefficients, and then runlength-encoding runs of zeroes. Finally, the runlengths and non-zero frequency coefficients are entropy coded. Decompression is the inverse process of compression.
P-0211[0211] 6.2.4.2 CMYK Contone JPEG Compression Format
P-0212[0212] The CMYK contone layer is compressed to an interleaved color JPEG bytestream. The interleaving is required for space-efficient decompression in the printer, but may restrict the decoder to two sets of Huffman tables rather than four (i.e. one per color channel). If luminance and chrominance are separated, then the luminance channels can share one set of tables, and the chrominance channels the other set.
P-0213[0213] If luminance/chrominance separation is deemed necessary, either for the purposes of table sharing or for chrominance subsampling, then CMY is converted to YCrCb and Cr and Cb are duly subsampled. K is treated as a luminance channel and is not subsampled.
P-0214[0214] The JPEG bytestream is complete and self-contained. It contains all data required for decompression, including quantization and Huffman tables.
P-0215[0215] 7 Printer Controller
P-0216[0216] 7.1 Printer Controller Architecture
P-0217[0217] A printer controller <b>178</b> (FIG. 18) consists of the CePrint central processor (CCP) chip <b>180</b>, a 64 MBit RDRAM <b>182</b>, and a master QA chip <b>184</b>.
P-0218[0218] The CCP <b>180</b> contains a general-purpose processor <b>181</b> and a set of purpose-specific functional units controlled by the processor via a processor bus <b>186</b>. Only three functional units are non-standard—an EDRL expander <b>188</b>, a halftoner/compositor <b>190</b>, and a printhead interface <b>192</b> which controls the Memjet printhead <b>143</b>.
P-0219[0219] Software running on the processor <b>181</b> coordinates the various functional units to receive, expand and print pages. This is described in the next section.
P-0220[0220] The various functional units of the CCP <b>180</b> are described in subsequent sections.
P-0221[0221] 7.2 Page Expansion and Printing
P-0222[0222] Page expansion and printing proceeds as follows. A page description is received from the host via a host interface <b>194</b> and is stored in main memory <b>182</b>. 6 MB of main memory <b>182</b> is dedicated to page storage. This can hold two pages each not exceeding 3 MB, or one page up to 6 MB. If the host generates pages not exceeding 3 MB, then the printer operates in streaming mode—i.e. it prints one page while receiving the next. If the host generates pages exceeding 3 MB, then the printer operates in single-page mode—i.e. it receives each page and prints it before receiving the next. If the host generates pages exceeding 6 MB then they are rejected by the printer. In practice the printer driver prevents this from happening.
P-0223[0223] A page consists of two parts—the bi-level black layer, and the contone layer. These are compressed in distinct formats—the bi-level black layer in EDRL format, the contone layer in JPEG format. The first stage of page expansion consists of decompressing the two layers in parallel. The bi-level layer is decompressed by the EDRL expander unit <b>188</b>, the contone layer by a JPEG decoder <b>196</b>.
P-0224[0224] The second stage of page expansion consists of halftoning the contone CMYK data to bi-level CMYK, and then compositing the bi-level black layer over the bi-level CMYK layer. The halftoning and compositing is carried out by the halftoner/compositor unit <b>190</b>.
P-0225[0225] Finally, the composited bi-level CMYK image is printed via the printhead interface unit <b>192</b>, which controls the Memjet printhead <b>143</b>.
P-0226[0226] Because the Memjet printhead <b>143</b> prints at high speed, the paper <b>144</b> must move past the printhead <b>143</b> at a constant velocity. If the paper <b>144</b> is stopped because data cannot be fed to the printhead <b>143</b> fast enough, then visible printing irregularities will occur. It is therefore important to transfer bi-level CMYK data to the printhead interface <b>192</b> at the required rate.
P-0227[0227] A fully-expanded 1600 dpi bi-level CMYK page has an image size of 119 MB. Because it is impractical to store an expanded page in printer memory, each page is expanded in real time during printing. Thus the various stages of page expansion and printing are pipelined. The page expansion and printing data flow is described in Table 15. The aggregate traffic to/from main memory via an interface <b>198</b> of 182 MB/s is well within the capabilities of current technologies such as Rambus. <tables id="TABLE-US-00017" num="17"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="259PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 15</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Page expansion and printing data flow</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="7"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="28PT" align="left" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="42PT" align="center" /><colspec colname="7" colwidth="42PT" align="center" /><tbody valign="top"><row><entry /><entry /><entry>input</entry><entry /><entry>output</entry><entry>input</entry><entry>output</entry></row><row><entry>process</entry><entry>input</entry><entry>window</entry><entry>output</entry><entry>window</entry><entry>rate</entry><entry>rate</entry></row><row><entry namest="1" nameend="7" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="8"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="28PT" align="left" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="42PT" align="center" /><colspec colname="7" colwidth="21PT" align="right" /><colspec colname="8" colwidth="21PT" align="left" /><tbody valign="top"><row><entry>Receive</entry><entry>—</entry><entry>—</entry><entry>JPEG</entry><entry>1</entry><entry>—</entry><entry>1.5</entry><entry>MB/s</entry></row><row><entry>contone</entry><entry /><entry /><entry>stream</entry><entry /><entry>—</entry><entry>3.5</entry><entry>Mp/s</entry></row><row><entry>receive</entry><entry>—</entry><entry>—</entry><entry>EDRL</entry><entry>1</entry><entry>—</entry><entry>1.5</entry><entry>MB/s</entry></row><row><entry>bi-level</entry><entry /><entry /><entry>stream</entry><entry /><entry>—</entry><entry>31</entry><entry>Mp/s</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="9"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="28PT" align="left" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="21PT" align="right" /><colspec colname="7" colwidth="21PT" align="left" /><colspec colname="8" colwidth="21PT" align="right" /><colspec colname="9" colwidth="21PT" align="left" /><tbody valign="top"><row><entry>decompress</entry><entry>JPEG</entry><entry>—</entry><entry>32-bit</entry><entry>8</entry><entry>1.5</entry><entry>MB/s</entry><entry>13</entry><entry>MB/s</entry></row><row><entry>contone</entry><entry>stream</entry><entry /><entry>CMYK</entry><entry /><entry>3.5</entry><entry>Mp/s</entry><entry>3.5</entry><entry>Mp/s</entry></row><row><entry>decompress</entry><entry>EDRL</entry><entry>—</entry><entry>1-bit K</entry><entry>1</entry><entry>1.5</entry><entry>MB/s</entry><entry>15</entry><entry>MB/s</entry></row><row><entry>bi-level</entry><entry>stream</entry><entry /><entry /><entry /><entry>31</entry><entry>Mp/s<sup>a</sup></entry><entry>124</entry><entry>Mp/s</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="8"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="28PT" align="left" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="21PT" align="right" /><colspec colname="7" colwidth="21PT" align="left" /><colspec colname="8" colwidth="42PT" align="center" /><tbody valign="top"><row><entry>halftone</entry><entry>32-bit</entry><entry>1</entry><entry>—<sup>b</sup></entry><entry>—</entry><entry>13</entry><entry>MB/s</entry><entry>—</entry></row><row><entry /><entry>CMYK</entry><entry /><entry /><entry /><entry>3.5</entry><entry>Mp/s<sup>c</sup></entry><entry>—</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="9"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="28PT" align="left" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="21PT" align="right" /><colspec colname="7" colwidth="21PT" align="left" /><colspec colname="8" colwidth="21PT" align="right" /><colspec colname="9" colwidth="21PT" align="left" /><tbody valign="top"><row><entry>composite</entry><entry>1-bit</entry><entry>1</entry><entry>4-bit</entry><entry>1</entry><entry>15</entry><entry>MB/s</entry><entry>60</entry><entry>MB/s</entry></row><row><entry /><entry>K</entry><entry /><entry>CMYK</entry><entry /><entry>124</entry><entry>Mp/s</entry><entry>124</entry><entry>Mp/s</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="8"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="28PT" align="left" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="21PT" align="right" /><colspec colname="7" colwidth="21PT" align="left" /><colspec colname="8" colwidth="42PT" align="center" /><tbody valign="top"><row><entry>print</entry><entry>4-bit</entry><entry>24, 1<sup>d</sup></entry><entry>—</entry><entry>—</entry><entry>60</entry><entry>MB/s</entry><entry>—</entry></row><row><entry /><entry>CMYK</entry><entry /><entry /><entry /><entry>124</entry><entry>Mp/s</entry><entry>—</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="9"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="28PT" align="left" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="21PT" align="right" /><colspec colname="7" colwidth="21PT" align="left" /><colspec colname="8" colwidth="21PT" align="right" /><colspec colname="9" colwidth="21PT" align="left" /><tbody valign="top"><row><entry /><entry /><entry /><entry /><entry /><entry>91</entry><entry>MB/s</entry><entry>91</entry><entry>MB/S</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry /><entry>182</entry><entry>MB/S</entry></row><row><entry namest="1" nameend="9" align="center" rowsep="1" /></row><row><entry namest="1" nameend="9" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="9" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="9" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="9" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0228[0228] Each stage communicates with the next via a shared FIFO in main memory <b>182</b>. Each FIFO is organized into lines, and the minimum size (in lines) of each FIFO is designed to accommodate the output window (in lines) of the producer and the input window (in lines) of the consumer. Inter-stage main memory buffers are described in Table 16. The aggregate buffer space usage of 6.3 MB leaves 1.7 MB free for program code and scratch memory (out of the 8 MB available). <tables id="TABLE-US-00018" num="18"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="273PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 16</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Page expansion and printing main memory buffers</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="77PT" align="left" /><colspec colname="2" colwidth="112PT" align="left" /><colspec colname="3" colwidth="42PT" align="center" /><colspec colname="4" colwidth="42PT" align="center" /><tbody valign="top"><row><entry /><entry>organization</entry><entry>number</entry><entry>buffer</entry></row><row><entry>buffer</entry><entry>and line size</entry><entry>of lines</entry><entry>size</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="77PT" align="left" /><colspec colname="2" colwidth="112PT" align="left" /><colspec colname="3" colwidth="42PT" align="center" /><colspec colname="4" colwidth="21PT" align="right" /><colspec colname="5" colwidth="21PT" align="left" /><tbody valign="top"><row><entry>compressed page buffer</entry><entry>byte stream</entry><entry>—</entry><entry>6</entry><entry>MB</entry></row><row><entry /><entry>(one or two pages)</entry></row><row><entry>contone CMYK buffer</entry><entry>32-bit interleaved CMYK</entry><entry>8 × 2 = 16</entry><entry>142</entry><entry>KB</entry></row><row><entry /><entry>(267 ppi × 8.5″ × 32 = 8.9 KB)</entry></row><row><entry>bi-level K buffer</entry><entry>1-bit K</entry><entry>1 × 2 = 2 </entry><entry>3</entry><entry>KB</entry></row><row><entry /><entry>(1600 dpi × 8.5″ × 1 = 1.7 B)</entry></row><row><entry>bi-level CMYK buffer</entry><entry>4-bit planar odd/even CMYK (1600</entry><entry>24 + 1 = 25 </entry><entry>166</entry><entry>KB</entry></row><row><entry /><entry>dpi × 8.5″ × 4 = 6.6 KB)</entry></row><row><entry /><entry /><entry /><entry>6.3</entry><entry>MB</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0229[0229] The overall data flow, including FIFOs, is illustrated in FIG. 19.
P-0230[0230] Contone page decompression is carried out by the JPEG decoder <b>196</b>. Bi-level page decompression is carried out by the EDRL expander <b>188</b>. Halftoning and compositing is carried out by the halftoner/compositor unit <b>190</b>. These functional units are described in the following sections.
P-0231[0231] 7.2.1 DMA Approach
P-0232[0232] Each functional unit contains one or more on-chip input and/or output FIFOs. Each FIFO is allocated a separate channel in a multi-channel DMA controller <b>200</b>. The DMA controller <b>200</b> handles single-address rather than double-address transfers, and so provides a separate request/acknowledge interface for each channel.
P-0233[0233] Each functional unit stalls gracefully whenever an input FIFO is exhausted or an output FIFO is filled.
P-0234[0234] The processor <b>181</b> programs each DMA transfer. The DMA controller <b>200</b> generates the address for each word of the transfer on request from the functional unit connected to the channel. The functional unit latches the word onto or off the data bus <b>186</b> when its request is acknowledged by the DMA controller <b>200</b>. The DMA controller <b>200</b> interrupts the processor <b>181</b> when the transfer is complete, thus allowing the processor <b>181</b> to program another transfer on the same channel in a timely fashion.
P-0235[0235] In general the processor <b>181</b> will program another transfer on a channel as soon as the corresponding main memory FIFO is available (i.e. non-empty for a read, non-full for a write).
P-0236[0236] The granularity of channel servicing implemented in the DMA controller <b>200</b> depends somewhat on the latency of main memory <b>182</b>.
P-0237[0237] 7.2.2 EDRL Expander
P-0238[0238] The EDRL expander unit (EEU) <b>188</b> is shown in greater detail in FIG. 20. The unit <b>188</b> decompresses an EDRL-compressed bi-level image.
P-0239[0239] The input to the EEU <b>188</b> is an EDRL bitstream. The output from the EEU is a set of bi-level image lines, scaled horizontally from the resolution of the expanded bi-level image by an integer scale factor to 1600 dpi.
P-0240[0240] Once started, the EEU <b>188</b> proceeds until it detects an end-of-page code in the EDRL bitstream, or until it is explicitly stopped via its control register.
P-0241[0241] The EEU <b>188</b> relies on an explicit page width to decode the bitstream. This must be written to a page width register <b>202</b> prior to starting the EEU <b>188</b>.
P-0242[0242] The scaling of the expanded bi-level image relies on an explicit scale factor. This must be written to a scale factor register <b>204</b> prior to starting the EEU <b>188</b>. <tables id="TABLE-US-00019" num="19"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 17</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>EDRL expander control and configuration registers</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="42PT" align="left" /><colspec colname="2" colwidth="35PT" align="center" /><colspec colname="3" colwidth="126PT" align="left" /><tbody valign="top"><row><entry /><entry>register</entry><entry>width</entry><entry>description</entry></row><row><entry /><entry namest="OFFSET" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="42PT" align="left" /><colspec colname="2" colwidth="35PT" align="char" char="." /><colspec colname="3" colwidth="126PT" align="left" /><tbody valign="top"><row><entry /><entry>start</entry><entry>1</entry><entry>Start the EEU.</entry></row><row><entry /><entry>stop</entry><entry>1</entry><entry>Stop the EEU.</entry></row><row><entry /><entry>page width</entry><entry>13</entry><entry>Page width used during decoding to</entry></row><row><entry /><entry /><entry /><entry>detect end-of-line.</entry></row><row><entry /><entry>scale factor</entry><entry>4</entry><entry>Scale factor used during scaling of</entry></row><row><entry /><entry /><entry /><entry>expanded image.</entry></row><row><entry /><entry namest="OFFSET" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0243[0243] The EDRL compression format is described in Section 6.2.3.2. It represents a bi-level image in terms of its edges. Each edge in each line is coded relative to an edge in the previous line, or relative to the previous edge in the same line. No matter how it is coded, each edge is ultimately decoded to its distance from the previous edge in the same line. This distance, or runlength, is then decoded to the string of one bits or zero bits which represent the corresponding part of the image. The decompression algorithm is defined in Section 6.2.3.2.
P-0244[0244] The EEU <b>188</b> consists of a bitstream decoder <b>206</b>, a state machine <b>208</b>, edge calculation logic <b>210</b>, two runlength decoders <b>212</b>, and a runlength (re)encoder <b>214</b>. The bitstream decoder <b>206</b> decodes an entropy-coded codeword from the bitstream and passes it to the state machine <b>208</b>. The state machine <b>208</b> returns the size of the codeword to the bitstream decoder <b>206</b>, which allows the decoder <b>206</b> to advance to the next codeword. In the case of a create edge code, the state machine <b>208</b> uses the bitstream decoder <b>206</b> to extract the corresponding runlength from the bitstream. The state machine <b>208</b> controls the edge calculation logic <b>210</b> and runlength decoding/encoding as defined in Table 19.
P-0245[0245] The edge calculation logic <b>210</b> is quite simple. The current edge offset in the previous (reference) and current (coding) lines are maintained in a reference edge register <b>216</b> and edge register <b>218</b> respectively. The runlength associated with a create edge code is output directly to the runlength decoder <b>212</b>.<b>1</b>, and is added to the current edge. A delta code is translated into a runlength by adding the associated delta to the reference edge and subtracting the current edge. The generated runlength is output to the runlength decoder <b>212</b>.<b>1</b>, and is added to the current edge. The next runlength is extracted from the runlength encoder <b>214</b> and added to the reference edge. A kill edge code simply causes the current reference edge to be skipped. Again the next runlength is extracted from the runlength encoder <b>214</b> and added to the reference edge.
P-0246[0246] Each time the edge calculation logic <b>210</b> generates a runlength representing an edge, it is passed to the runlength decoder <b>212</b>.<b>1</b>. While the runlength decoder <b>212</b>.<b>1</b> decodes the run it generates a stall signal to the state machine <b>208</b>. Since the runlength decoder <b>212</b> is slower than the edge calculation logic <b>210</b>, there is not much point in decoupling it. The expanded line accumulates in a line buffer <b>220</b> large enough to hold an 8.5″ 800 dpi line (850 bytes).
P-0247[0247] The previously expanded line is also buffered in a buffer <b>222</b>. It acts as a reference for the decoding of the current line. The previous line is re-encoded as runlengths on demand. This is less expensive than buffering the decoded runlengths of the previous line, since the worst case is one 13-bit runlength for each pixel (20 KB at 1600 dpi). While the runlength encoder <b>214</b> encodes the run it generates a stall signal to the state machine <b>208</b>. The runlength encoder <b>214</b> uses the page width to detect end-of-line. The (current) line buffer <b>220</b> and the previous line buffer <b>222</b> are concatenated and managed as a single FIFO to simplify the runlength encoder <b>214</b>.
P-0248[0248] The second runlength decoder <b>212</b>.<b>2</b> decodes the output runlength to a line buffer <b>224</b> large enough to hold an 8.5″ 1600 dpi line (1700 bytes). The runlength passed to this output runlength decoder <b>212</b>.<b>2</b> is multiplied by the scale factor from the register <b>204</b>, so this decoder <b>212</b>.<b>2</b> produces 1600 dpi lines. The line is output scale factor times through the output pixel FIFO. This achieves the required vertical scaling by simple line replication. The EEU <b>188</b> could be designed with edge smoothing integrated into its image scaling. A simple smoothing scheme based on template-matching can be very effective. This would require a multi-line buffer between the low-resolution runlength decoder and the smooth scaling unit, but would eliminate the high-resolution runlength decoder.
P-0249[0249] 7.2.2.1 EDRL Stream Decoder
P-0250[0250] The EDRL stream decoder <b>206</b> (FIG. 21) decodes entropy-coded EDRL codewords in the input bitstream. It uses a two-byte input buffer <b>226</b> viewed through a 16-bit barrel shifter <b>228</b> whose left (most significant) edge is always aligned to a codeword boundary in the bitstream. A decoder <b>230</b> connected to the barrel shifter <b>228</b> decodes a codeword according to Table 18, and supplies the state machine <b>208</b> with the corresponding code. <tables id="TABLE-US-00020" num="20"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 18</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>EDRL stream codeword decoding table</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="98PT" align="center" /><colspec colname="2" colwidth="63PT" align="left" /><colspec colname="3" colwidth="56PT" align="center" /><tbody valign="top"><row><entry /><entry /><entry>output code</entry></row><row><entry>input codeword bit pattern<sup>a</sup></entry><entry>output code</entry><entry>bit pattern</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>1xxx xxxx</entry><entry>Δ0</entry><entry>1 0000 0000</entry></row><row><entry>010x xxxx</entry><entry>Δ + 1</entry><entry>0 1000 0000</entry></row><row><entry>011x xxxx</entry><entry>Δ − 1</entry><entry>0 0100 0000</entry></row><row><entry>0010 xxxx</entry><entry>kill edge</entry><entry>0 0010 0000</entry></row><row><entry>0011 xxxx</entry><entry>create near edge</entry><entry>0 0001 0000</entry></row><row><entry>0001 0xxx</entry><entry>Δ + 2</entry><entry>0 0000 1000</entry></row><row><entry>0001 1xxx</entry><entry>Δ − 2</entry><entry>0 0000 0100</entry></row><row><entry>0000 1xxx</entry><entry>create far edge</entry><entry>0 0000 0010</entry></row><row><entry>0000 01xx</entry><entry>end-of-page (EOP)</entry><entry>0 0000 0001</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry namest="1" nameend="3" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0251[0251] The state machine <b>208</b> in turn outputs the length of the code. This is added, modulo-8, by an accumulator <b>232</b> to the current codeword bit offset to yield the next codeword bit offset. The bit offset in turn controls the barrel shifter <b>228</b>. If the codeword bit offset wraps, then the carry bit controls the latching of the next byte from the input FIFO. At this time byte <b>2</b> is latched to byte <b>1</b>, and the FIFO output is latched to byte <b>2</b>. It takes two cycles of length <b>8</b> to fill the input buffer. This is handled by starting states in the state machine <b>208</b>.
P-0252[0252] 7.2.2.2 EDRL Expander State Machine
P-0253[0253] The EDRL expander state machine <b>208</b> controls the edge calculation and runlength expansion logic in response to codes supplied by the EDRL stream decoder <b>206</b>. It supplies the EDRL stream decoder <b>206</b> with the length of the current codeword and supplies the edge calculation logic <b>210</b> with the delta value associated with the current delta code. The state machine <b>206</b> also responds to start and stop control signals from a control register <b>234</b> (FIG. 20), and the end-of-line (EOL) signal from the edge calculation logic <b>210</b>.
P-0254[0254] The state machine <b>208</b> also controls the multi-cycle fetch of the runlength associated with a create edge code. <tables id="TABLE-US-00021" num="21"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="273PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 19</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>EDRL expander state machine</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="7"><colspec colname="1" colwidth="21PT" align="left" /><colspec colname="2" colwidth="35PT" align="left" /><colspec colname="3" colwidth="42PT" align="left" /><colspec colname="4" colwidth="49PT" align="left" /><colspec colname="5" colwidth="21PT" align="center" /><colspec colname="6" colwidth="21PT" align="center" /><colspec colname="7" colwidth="84PT" align="left" /><tbody valign="top"><row><entry>input</entry><entry>input</entry><entry>current</entry><entry /><entry>code</entry><entry /><entry /></row><row><entry>signal</entry><entry>code</entry><entry>state</entry><entry>next state</entry><entry>len</entry><entry>delta</entry><entry>actions</entry></row><row><entry namest="1" nameend="7" align="center" rowsep="1" /></row><row><entry>start</entry><entry>—</entry><entry>stopped</entry><entry>starting</entry><entry>8</entry><entry>—</entry><entry>—</entry></row><row><entry>—</entry><entry>—</entry><entry>starting</entry><entry>idle</entry><entry>8</entry><entry>—</entry><entry>—</entry></row><row><entry>stop</entry><entry>—</entry><entry>—</entry><entry>stopped</entry><entry>0</entry><entry>—</entry><entry>reset RL decoders and</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>FIFOs</entry></row><row><entry>EOL</entry><entry>—</entry><entry>—</entry><entry>EOL 1</entry><entry>0</entry><entry>—</entry><entry>reset RL encoder;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>reset RL decoders;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>reset ref. edge</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>and edge</entry></row><row><entry>—</entry><entry>—</entry><entry>EOL 1</entry><entry>idle</entry><entry /><entry /><entry>RL encoder →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. edge + ref. RL → ref.</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge</entry></row><row><entry>—</entry><entry>Δ0</entry><entry>idle</entry><entry>idle</entry><entry>1</entry><entry>0</entry><entry>edge − ref. edge + delta →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge + RL → edge;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL → RL decoder;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL encoder →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. edge + ref. RL → ref.</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge</entry></row><row><entry>—</entry><entry>Δ + 1</entry><entry>idle</entry><entry>idle</entry><entry>2</entry><entry>+1</entry><entry>edge − ref. edge + delta →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge + RL → edge;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL → RL decoder;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL encoder →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. edge + ref. RL → ref.</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge</entry></row><row><entry>—</entry><entry>Δ − 1</entry><entry>idle</entry><entry>idle</entry><entry>3</entry><entry>−1</entry><entry>edge − ref. edge + delta →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge + RL → edge;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL → RL decoder;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL encoder →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. edge + ref. RL → ref.</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge</entry></row><row><entry>—</entry><entry>Δ + 2</entry><entry>idle</entry><entry>idle</entry><entry>4</entry><entry>+2</entry><entry>edge − ref. edge + delta →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge + RL → edge;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL → RL decoder;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL encoder →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. edge + ref. RL → ref.</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge</entry></row><row><entry>—</entry><entry>Δ − 2</entry><entry>idle</entry><entry>idle</entry><entry>5</entry><entry>−2</entry><entry>edge − ref. edge + delta →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge + RL → edge;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL → RL decoder;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL encoder →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. edge + ref. RL → ref.</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge</entry></row><row><entry>—</entry><entry>kill edge</entry><entry>idle</entry><entry>idle</entry><entry>6</entry><entry>—</entry><entry>RL encoder →</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>ref. edge + ref. RL → ref.</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge</entry></row><row><entry>—</entry><entry>create</entry><entry>idle</entry><entry>create RL lo 7</entry><entry>7</entry><entry>—</entry><entry>reset create RL</entry></row><row><entry /><entry>near edge</entry></row><row><entry>—</entry><entry>create far</entry><entry>idle</entry><entry>create RL hi 6</entry><entry>8</entry><entry>—</entry><entry>—</entry></row><row><entry /><entry>edge</entry></row><row><entry>—</entry><entry>EOP</entry><entry>idle</entry><entry>stopped</entry><entry>8</entry><entry>—</entry><entry>—</entry></row><row><entry>—</entry><entry>—</entry><entry>create RL</entry><entry>create RL lo 7</entry><entry>6</entry><entry>—</entry><entry>latch</entry></row><row><entry /><entry /><entry>hi 6</entry><entry /><entry /><entry /><entry>create RL hi 6</entry></row><row><entry>—</entry><entry>—</entry><entry>create RL</entry><entry>create edge</entry><entry>7</entry><entry>—</entry><entry>latch</entry></row><row><entry /><entry /><entry>lo7</entry><entry /><entry /><entry /><entry>create RL lo 7</entry></row><row><entry>—</entry><entry>—</entry><entry>create edge</entry><entry>idle</entry><entry>0</entry><entry>—</entry><entry>create RL → RL;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>edge + RL → edge;</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>RL → RL encoder</entry></row><row><entry namest="1" nameend="7" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0255[0255] 7.2.2.3 Runlength Decoder
P-0256[0256] The runlength decoder <b>212</b> expands a runlength into a sequence of zero bits or one bits of the corresponding length in the output stream. The first run in a line is assumed to be white (color <b>0</b>). Each run is assumed to be of the opposite color to its predecessor. If the first run is actually black (color <b>1</b>), then it must be preceded by a zero-length white run. The runlength decoder <b>212</b> keeps track of the current color internally.
P-0257[0257] The runlength decoder <b>212</b> appends a maximum of 8 bits to the output stream every clock. Runlengths are typically not an integer multiple of 8, and so runs other than the first in an image are typically not byte-aligned. The runlength decoder <b>212</b> maintains, in a byte space register <b>236</b> (FIG. 22), the number of bits available in the byte currently being built. This is initialized to 8 at the beginning of decoding, and on the output of every byte.
P-0258[0258] The decoder <b>212</b> starts outputting a run of bits as soon as the next run line <b>248</b> latches a non-zero value into a runlength register <b>238</b>. The decoder <b>212</b> effectively stalls when the runlength register <b>238</b> goes to zero.
P-0259[0259] A number of bits of the current color are shifted into an output byte register <b>240</b> each clock. The current color is maintained in a 1-bit color register <b>242</b>. The number of bits actually output is limited by the number of bits left in the runlength, and by the number of spare bits left in the output byte. The number of bits output is subtracted from the runlength and the byte space. When the runlength goes to zero it has been completely decoded, although the trailing bits of the run may still be in the output byte register <b>240</b>, pending output. When the byte space goes to zero the output byte is full and is appended to the output stream.
P-0260[0260] A 16-bit barrel shifter <b>244</b>, the output byte register <b>240</b> and the color register <b>242</b> together implement an 8-bit shift register which can be shifted multiple bit positions every clock, with the color as the serial input.
P-0261[0261] An external reset line <b>246</b> is used to reset the runlength decoder <b>212</b> at the start of a line. An external next run line <b>248</b> is used to request the decoding of a new runlength. It is accompanied by a runlength on an external runlength line <b>250</b>. The next run line <b>248</b> should not be set on the same clock as the reset line <b>246</b>. Because next run inverts the current color, the reset of the color sets it to one, not zero. An external flush line <b>252</b> is used to flush the last byte of the run, if incomplete. It can be used on a line-by-line basis to yield byte-aligned lines, or on an image basis to yield a byte-aligned image.
P-0262[0262] An external ready line <b>254</b> indicates whether the runlength decoder <b>212</b> is ready to decode a runlength. It can be used to stall the external logic.
P-0263[0263] 7.2.2.4 Runlength Encoder
P-0264[0264] The runlength encoder <b>214</b> detects a run of zero or one bits in the input stream. The first run in a line is assumed to be white (color <b>0</b>). Each run is assumed to be of the opposite color to its predecessor. If the first run is actually black (color <b>1</b>), then the runlength encoder <b>214</b> generates a zero-length white run at the start of the line. The runlength decoder keeps track of the current color internally.
P-0265[0265] The runlength encoder <b>214</b> reads a maximum of 8 bits from the input stream every clock. It uses a two-byte input buffer <b>256</b> (FIG. 23) viewed through a 16-bit barrel shifter <b>258</b> whose left (most significant) edge is always aligned to the current position in the bitstream. An encoder <b>260</b> connected to the barrel shifter <b>258</b> encodes an 8-bit (partial) runlength according to Table 20. The 8-bit runlength encoder <b>260</b> uses the current color to recognize runs of the appropriate color.
P-0266[0266] The 8-bit runlength generated by the 8-bit runlength encoder <b>260</b> is added to the value in a runlength register <b>262</b>. When the 8-bit runlength encoder <b>260</b> recognizes the end of the current run it generates an end-of-run signal which is latched by a ready register <b>264</b>. The output of the ready register <b>264</b> indicates that the encoder <b>214</b> has completed encoding the current runlength, accumulated in the runlength register <b>262</b>. The output of the ready register <b>264</b> is also used to stall the 8-bit runlength encoder <b>260</b>. When stalled the 8-bit runlength encoder <b>260</b> outputs a zero-length run and a zero end-of-run signal, effectively stalling the entire runlength encoder <b>214</b>. <tables id="TABLE-US-00022" num="22"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 20</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>8-bit runlength encoder table</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="28PT" align="center" /><colspec colname="2" colwidth="70PT" align="center" /><colspec colname="3" colwidth="35PT" align="center" /><colspec colname="4" colwidth="70PT" align="center" /><tbody valign="top"><row><entry /><entry>Color</entry><entry>input</entry><entry>length</entry><entry>end-of-run</entry></row><row><entry /><entry namest="OFFSET" nameend="4" align="center" rowsep="1" /></row><row><entry /><entry>0</entry><entry>0000 0000</entry><entry>8</entry><entry>0</entry></row><row><entry /><entry>0</entry><entry>0000 0001</entry><entry>7</entry><entry>1</entry></row><row><entry /><entry>0</entry><entry>0000 001x</entry><entry>6</entry><entry>1</entry></row><row><entry /><entry>0</entry><entry>0000 01xx</entry><entry>5</entry><entry>1</entry></row><row><entry /><entry>0</entry><entry>0000 1xxx</entry><entry>4</entry><entry>1</entry></row><row><entry /><entry>0</entry><entry>0001 xxxx</entry><entry>3</entry><entry>1</entry></row><row><entry /><entry>0</entry><entry>001x xxxx</entry><entry>2</entry><entry>1</entry></row><row><entry /><entry>0</entry><entry>01xx xxxx</entry><entry>1</entry><entry>1</entry></row><row><entry /><entry>0</entry><entry>1xxx xxxx</entry><entry>0</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>1111 1111</entry><entry>8</entry><entry>0</entry></row><row><entry /><entry>1</entry><entry>1111 1110</entry><entry>7</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>1111 110x</entry><entry>6</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>1111 10xx</entry><entry>5</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>1111 0xxx</entry><entry>4</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>1110 xxxx</entry><entry>3</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>110x xxxx</entry><entry>2</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>10xx xxxx</entry><entry>1</entry><entry>1</entry></row><row><entry /><entry>1</entry><entry>0xxx xxxx</entry><entry>0</entry><entry>1</entry></row><row><entry /><entry namest="OFFSET" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0267[0267] The Output of the 8-bit runlength encoder <b>260</b> is limited by the remaining page width. The actual 8-bit runlength is subtracted from the remaining page width, and is added to a modulo-8 bit position accumulator <b>266</b> used to control the barrel shifter <b>258</b> and clock the byte stream input.
P-0268[0268] An external reset line <b>268</b> is used to reset the runlength encoder <b>214</b> at the start of a line. It resets the current color and latches a page width signal on line <b>270</b> into a page width register <b>272</b>. An external next run line <b>274</b> is used to request another runlength from the runlength encoder <b>214</b>. It inverts the current color, and resets the runlength register <b>262</b> and ready register <b>264</b>. An external flush line <b>276</b> is used to flush the last byte of the run, if incomplete. It can be used on a line-by-line basis to process byte-aligned lines, or on an image basis to process a byte-aligned image.
P-0269[0269] An external ready line <b>278</b> indicates that the runlength encoder <b>214</b> is ready to encode a runlength, and that the current runlength is available on a runlength line <b>280</b>. It can be used to stall the external logic.
P-0270[0270] 7.2.2.5 Timing
P-0271[0271] The EEU <b>188</b> has an output rate of 124M 1-bit black pixels/s. The core logic generates one runlength every clock. The runlength decoders <b>212</b> and the runlength encoder <b>214</b> generate/consume up to 8 pixels (bits) per clock. One runlength decoder <b>212</b>.<b>1</b> and the runlength encoder <b>214</b> operate at quarter resolution (800 dpi). The other runlength decoder <b>212</b>.<b>2</b> operates at full resolution (1600 dpi).
P-0272[0272] A worst-case bi-level image consisting of a full page of 3 point text converts to approximately 6M runlengths at 800 dpi (the rendering resolution). At 1600 dpi (the horizontal output resolution) this gives an average runlength of about 20. Consequently about 40% of 8-pixel output bytes span two runs and so require two clocks instead of one. Output lines are replicated vertically to achieve a vertical resolution of 1600 dpi. When a line is being replicated rather than generated it has a perfect efficiency of 8 pixels per clock, thus the overhead is halved to 20%.
P-0273[0273] The full-resolution runlength decoder in the output stage of the EEU <b>188</b> is the slowest component in the EEU <b>188</b>. The minimum clock speed of the EEU <b>188</b> is therefore dictated by the output pixel rate of the EEU (124 Mpixels/s), divided by the width of the runlength decoder (<b>8</b>), adjusted for its worst-case overhead (20%). This gives a minimum speed of about 22 MHz.
P-0274[0274] 7.2.3 JPEG Decoder
P-0275[0275] The JPEG decoder <b>196</b> (FIG. 24) decompresses a JPEG-compressed CMYK contone image.
P-0276[0276] The input to the JPEG decoder <b>196</b> is a JPEG bitstream. The output from the JPEG decoder <b>196</b> is a set of contone CMYK image lines.
P-0277[0277] When decompressing, the JPEG decoder <b>196</b> writes its output in the form of 8×8 pixel blocks. These are sometimes converted to full-width lines via an page width×8 strip buffer closely coupled with the codec. This would require a 67 KB buffer. We instead use 8 parallel pixel FIFOs <b>282</b> with shared bus access and 8 corresponding DMA channels, as shown in FIG. 24.
P-0278[0278] 7.2.3.1 Timing
P-0279[0279] The JPEG decoder <b>196</b> has an output rate of 3.5M 32-bit CMYK pixels/s. The required clock speed of the decoder depends on the design of the decoder.
P-0280[0280] 7.2.4 Halftoner/Compositor
P-0281[0281] The halftoner/compositor unit (HCU) <b>190</b> (FIG. 25) combines the functions of halftoning the contone CMYK layer to bi-level CMYK, and compositing the black layer over the halftoned contone layer.
P-0282[0282] The input to the HCU <b>190</b> is an expanded 267 ppi CMYK contone layer, and an expanded 1600 dpi black layer. The output from the HCU <b>190</b> is a set of 1600 dpi bi-level CMYK image lines.
P-0283[0283] Once started, the HCU <b>190</b> proceeds until it detects an end-of-page condition, or until it is explicitly stopped via its control register <b>284</b>.
P-0284[0284] The HCU <b>190</b> generates a page of dots of a specified width and length. The width and length must be written to page width and page length registers of the control registers <b>284</b> prior to starting the HCU <b>190</b>. The page width corresponds to the width of the printhead. The page length corresponds to the length of the target page.
P-0285[0285] The HCU <b>190</b> generates target page data between specified left and right margins relative to the page width. The positions of the left and right margins must be written to left margin and right margin registers of the control registers <b>284</b> prior to starting the HCU <b>190</b>. The distance from the left margin to the right margin corresponds to the target page width.
P-0286[0286] The HCU <b>190</b> consumes black and contone data according to specified black and contone page widths. These page widths must be written to black page width and contone page width registers of the control registers <b>284</b> prior to starting the HCU <b>190</b>. The HCU <b>190</b> clips black and contone data to the target page width. This allows the black and contone page widths to exceed the target page width without requiring any special end-of-line logic at the input FIFO level.
P-0287[0287] The relationships between the page width, the black and contone page widths, and the margins are illustrated in FIG. 26.
P-0288[0288] The HCU <b>190</b> scales contone data to printer resolution both horizontally and vertically based on a specified scale factor. This scale factor must be written to a contone scalefactor register of the control registers <b>284</b> prior to starting the HCU <b>190</b>. <tables id="TABLE-US-00023" num="23"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 21</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Halftoner/compositor control and configuration registers</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="28PT" align="center" /><colspec colname="3" colwidth="119PT" align="left" /><tbody valign="top"><row><entry>register</entry><entry>width</entry><entry>description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="28PT" align="char" char="." /><colspec colname="3" colwidth="119PT" align="left" /><tbody valign="top"><row><entry>start</entry><entry>1</entry><entry>Start the HCU.</entry></row><row><entry>stop</entry><entry>1</entry><entry>Stop the HCU.</entry></row><row><entry>page width</entry><entry>14</entry><entry>Page width of printed page, in dots.</entry></row><row><entry /><entry /><entry>This is the number of dots which</entry></row><row><entry /><entry /><entry>have to be generated for each line.</entry></row><row><entry>left margin</entry><entry>14</entry><entry>Position of left margin, in dots.</entry></row><row><entry>right margin</entry><entry>14</entry><entry>Position of right margin, in dots.</entry></row><row><entry>page length</entry><entry>15</entry><entry>Page length of printed page, in dots.</entry></row><row><entry /><entry /><entry>This is the number of lines which</entry></row><row><entry /><entry /><entry>have to be generated for each page.</entry></row><row><entry>black page width</entry><entry>14</entry><entry>Page width of black layer, in dots.</entry></row><row><entry /><entry /><entry>Used to detect the end of a black</entry></row><row><entry /><entry /><entry>line.</entry></row><row><entry>contone page width</entry><entry>14</entry><entry>Page width of contone layer, in dots.</entry></row><row><entry /><entry /><entry>Used to detect the end of a</entry></row><row><entry /><entry /><entry>contone line.</entry></row><row><entry>contone</entry><entry>4</entry><entry>Scale factor used to scale contone</entry></row><row><entry>scale factor</entry><entry /><entry>data to bi-level resolution.</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0289[0289] The consumer of the data produced by the HCU <b>190</b> is the printhead interface <b>192</b>. The printhead interface <b>192</b> requires bi-level CMYK image data in planar format, i.e. with the color planes separated. Further, it also requires that even and odd pixels are separated. The output stage of the HCU <b>190</b> therefore uses 8 parallel pixel FIFOs <b>286</b>, one each for even cyan, odd cyan, even magenta, odd magenta, even yellow, odd yellow, even black, and odd black.
P-0290[0290] An input contone CMYK FIFO <b>288</b> is a full 9 KB line buffer. The line is used contone scale factor times to effect vertical up-scaling via line replication. FIFO write address wrapping is disabled until the start of the last use of the line. An alternative is to read the line from main memory contone scale factor times, increasing memory traffic by 44 MB/s, but avoiding the need for the on-chip 9 KB line buffer.
P-0291[0291] 7.2.4.1 Multi-Threshold Dither
P-0292[0292] A multi-threshold dither unit <b>290</b> is shown in FIG. 27 of the drawings. A general 256-layer dither volume provides great flexibility in dither cell design, by decoupling different intensity levels. General dither volumes can be large—a 64×64×256 dither volume, for example, has a size of 128 KB. They are also inefficient to access since each color component requires the retrieval of a different bit from the volume. In practice, there is no need to fully decouple each layer of the dither volume. Each dot column of the volume can be implemented as a fixed set of thresholds rather than 256 separate bits. Using three 8-bit thresholds, for example, only consumes 24 bits. Now, n thresholds define n+1 intensity intervals, within which the corresponding dither cell location is alternately not set or set. The contone pixel value being dithered uniquely selects one of the n+1 intervals, and this determines the value of the corresponding output dot.
P-0293[0293] We dither the contone data using a triple-threshold 64×64×3×8-bit (12 KB) dither volume. The three thresholds form a convenient 24-bit value which can be retrieved from the dither cell ROM in one cycle. If dither cell registration is desired between color planes, then the same triple-threshold value can be retrieved once and used to dither each color component. If dither cell registration is not desired, then the dither cell can be split into four subcells and stored in four separately addressable ROMs from which four different triple-threshold values can be retrieved in parallel in one cycle. Using the addressing scheme shown below, the four color planes share the same dither cell at vertical and/or horizontal offsets of 32 dots from each other.
P-0294[0294] Each triple-threshold unit <b>292</b> converts a triple-threshold value and an intensity value into an interval and thence a one or zero bit. The triple-thresholding rules are shown in Table 22. The corresponding logic is shown in FIG. 28. <tables id="TABLE-US-00024" num="24"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 22</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Triple-thresholding rules</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="49PT" align="left" /><colspec colname="1" colwidth="42PT" align="left" /><colspec colname="2" colwidth="126PT" align="center" /><tbody valign="top"><row><entry /><entry>interval</entry><entry>output</entry></row><row><entry /><entry namest="OFFSET" nameend="2" align="center" rowsep="1" /></row><row><entry /><entry>V ≦ T<sub>1</sub></entry><entry>0</entry></row><row><entry /><entry>T<sub>1</sub> < V ≦ T<sub>2</sub></entry><entry>1</entry></row><row><entry /><entry>T<sub>2</sub> < V ≦ T<sub>3</sub></entry><entry>0</entry></row><row><entry /><entry>T<sub>3</sub> < V</entry><entry>1</entry></row><row><entry /><entry namest="OFFSET" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0295[0295]<b>7</b>.<b>2</b>.<b>4</b>.<b>2</b> Composite
P-0296[0296] A composite unit <b>294</b> of the HCU <b>190</b> composites a black layer dot over a halftoned CMYK layer dot. If the black layer opacity is one, then the halftoned CMY is set to zero.
P-0297[0297] Given a 4-bit halftoned color C<sub>c</sub>M<sub>c</sub>Y<sub>c</sub>K<sub>c </sub>and a 1-bit black layer opacity K<sub>b</sub>, the composite logic is as defined in Table 23. <tables id="TABLE-US-00025" num="25"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 23</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Composite logic</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="140PT" align="center" /><colspec colname="2" colwidth="77PT" align="left" /><tbody valign="top"><row><entry>color channel</entry><entry>condition</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>C</entry><entry>C<sub>c</sub> {circumflex over ( )}<img file="US20030197774A1-20031023-P00802.TIF" id="custom-character-00001" he="20" wi="20" img-format="tif" img-content="tx" />K<sub>b</sub></entry></row><row><entry>M</entry><entry>M<sub>c</sub> {circumflex over ( )}<img file="US20030197774A1-20031023-P00802.TIF" id="custom-character-00002" he="20" wi="20" img-format="tif" img-content="tx" />K<sub>b</sub></entry></row><row><entry>Y</entry><entry>Y<sub>c</sub> {circumflex over ( )}<img file="US20030197774A1-20031023-P00802.TIF" id="custom-character-00003" he="20" wi="20" img-format="tif" img-content="tx" />K<sub>b</sub></entry></row><row><entry>K</entry><entry>K<sub>c</sub><img file="US20030197774A1-20031023-P00803.TIF" id="custom-character-00004" he="20" wi="20" img-format="tif" img-content="tx" />K<sub>b</sub></entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0298[0298] 7.2.4.3 Clock Enable Generator
P-0299[0299] A clock enable generator <b>296</b> of the HCU <b>190</b> generates enable signals for clocking the contone CMYK pixel input, the black dot input, and the CMYK dot output.
P-0300[0300] As described earlier, the contone pixel input buffer is used as both a line buffer and a FIFO. Each line is read once and then used contone scale factor times. FIFO write address wrapping is disabled until the start of the final replicated use of the line, at which time the clock enable generator <b>296</b> generates a contone line advance enable signal which enables wrapping.
P-0301[0301] The clock enable generator <b>296</b> also generates an even signal which is used to select the even or odd set of output dot FIFOs, and a margin signal which is used to generate white dots when the current dot position is in the left or right margin of the page.
P-0302[0302] The clock enable generator <b>296</b> uses a set of counters. The internal logic of the counters is defined in Table 24. The logic of the clock enable signals is defined in Table 25. <tables id="TABLE-US-00026" num="26"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="266PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 24</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Clock enable generator counter logic</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="6"><colspec colname="1" colwidth="42PT" align="left" /><colspec colname="2" colwidth="21PT" align="left" /><colspec colname="3" colwidth="14PT" align="center" /><colspec colname="4" colwidth="49PT" align="left" /><colspec colname="5" colwidth="56PT" align="left" /><colspec colname="6" colwidth="84PT" align="left" /><tbody valign="top"><row><entry /><entry /><entry /><entry /><entry>load</entry><entry>decrement</entry></row><row><entry>counter</entry><entry>abbr.</entry><entry>w.</entry><entry>data</entry><entry>condition</entry><entry>condition</entry></row><row><entry namest="1" nameend="6" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="6"><colspec colname="1" colwidth="42PT" align="left" /><colspec colname="2" colwidth="21PT" align="left" /><colspec colname="3" colwidth="14PT" align="char" char="." /><colspec colname="4" colwidth="49PT" align="left" /><colspec colname="5" colwidth="56PT" align="left" /><colspec colname="6" colwidth="84PT" align="left" /><tbody valign="top"><row><entry>dot</entry><entry>D</entry><entry>14</entry><entry>page width</entry><entry>RP<sup>a</sup><img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00005" he="20" wi="20" img-format="tif" img-content="tx" />EOL<sup>b</sup></entry><entry>(D > 0) {circumflex over ( )} clk</entry></row><row><entry>line</entry><entry>L</entry><entry>15</entry><entry>page length</entry><entry>RP</entry><entry>(L > 0) {circumflex over ( )} EOL</entry></row><row><entry>left margin</entry><entry>LM</entry><entry>14</entry><entry>left margin</entry><entry>RP <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00006" he="20" wi="20" img-format="tif" img-content="tx" />EOL</entry><entry>(LM > 0) {circumflex over ( )} clk</entry></row><row><entry>right margin</entry><entry>RM</entry><entry>14</entry><entry>right margin</entry><entry>RP <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00007" he="20" wi="20" img-format="tif" img-content="tx" />EOL</entry><entry>(RM > 0) {circumflex over ( )} clk</entry></row><row><entry>even/odd dot</entry><entry>E</entry><entry>1</entry><entry>0</entry><entry>RP <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00008" he="20" wi="20" img-format="tif" img-content="tx" />EOL</entry><entry>clk</entry></row><row><entry>black dot</entry><entry>BD</entry><entry>14</entry><entry>black width</entry><entry>RP <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00009" he="20" wi="20" img-format="tif" img-content="tx" />EOL</entry><entry>(LM = 0) {circumflex over ( )} (BD > 0) {circumflex over ( )} clk</entry></row><row><entry>contone dot</entry><entry>CD</entry><entry>14</entry><entry>contone width</entry><entry>RP <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00010" he="20" wi="20" img-format="tif" img-content="tx" />EOL</entry><entry>(LM = 0) {circumflex over ( )} (CD > 0) {circumflex over ( )} clk</entry></row><row><entry>contone</entry><entry>CSP</entry><entry>4</entry><entry>contone scale</entry><entry>RP <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00011" he="20" wi="20" img-format="tif" img-content="tx" />EOL <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00012" he="20" wi="20" img-format="tif" img-content="tx" /></entry><entry>(LM = 0) {circumflex over ( )} clk</entry></row><row><entry>sub-pixel</entry><entry /><entry /><entry>factor</entry><entry>(CSP = 0)</entry></row><row><entry>contone</entry><entry>CSL</entry><entry>4</entry><entry>contone scale</entry><entry>RP <img file="US20030197774A1-20031023-P00801.TIF" id="custom-character-00013" he="20" wi="20" img-format="tif" img-content="tx" />(CSL = 0)</entry><entry>EOL {circumflex over ( )} clk</entry></row><row><entry>sub-line</entry><entry /><entry /><entry>factor</entry></row><row><entry namest="1" nameend="6" align="center" rowsep="1" /></row><row><entry namest="1" nameend="6" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="6" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0303[0303]<tables id="TABLE-US-00027" num="27"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 25</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Clock enable generator output signal logic</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="91PT" align="left" /><colspec colname="2" colwidth="126PT" align="left" /><tbody valign="top"><row><entry>output signal</entry><entry>condition</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>output dot clock enable</entry><entry>(D > 0) {circumflex over ( )}<img file="US20030197774A1-20031023-P00802.TIF" id="custom-character-00014" he="20" wi="20" img-format="tif" img-content="tx" />EOP</entry></row><row><entry>black dot clock enable</entry><entry>(LM = 0) {circumflex over ( )}(BD > 0) {circumflex over ( )}<img file="US20030197774A1-20031023-P00802.TIF" id="custom-character-00015" he="20" wi="20" img-format="tif" img-content="tx" />EOP</entry></row><row><entry>contone pixel clock enable</entry><entry>(LM = 0) {circumflex over ( )}(CD > 0) {circumflex over ( )}(CSP = 0) {circumflex over ( )}<img file="US20030197774A1-20031023-P00802.TIF" id="custom-character-00016" he="20" wi="20" img-format="tif" img-content="tx" />EOP</entry></row><row><entry>contone line advance enable</entry><entry>(CSL = 0) {circumflex over ( )}<img file="US20030197774A1-20031023-P00802.TIF" id="custom-character-00017" he="20" wi="20" img-format="tif" img-content="tx" />EOP</entry></row><row><entry>even</entry><entry>E = 0</entry></row><row><entry>margin</entry><entry>(LM = 0) <img file="US20030197774A1-20031023-P00803.TIF" id="custom-character-00018" he="20" wi="20" img-format="tif" img-content="tx" />(RM = 0)</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry namest="1" nameend="2" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0304[0304]<b>7</b>.<b>2</b>.<b>4</b>.<b>4</b> Timing
P-0305[0305] The HCU <b>190</b> has an output rate of 124M 4-bit CMYK pixels/s. Since it generates one pixel per clock, it must be clocked at at least 124 MHz.
P-0306[0306] 7.3 Printhead Interface
P-0307[0307] CePrint <b>10</b> uses an 8.5″ CMYK Memjet printhead <b>143</b>, as described in Section 9. The printhead consists of 17 segments arranged in 2 segment groups. The first segment group contains 9 segments, and the second group contains 8 segments. There are 13,600 nozzles of each color in the printhead <b>143</b>, making a total of 54,400 nozzles. The printhead interface <b>192</b> is a standard Memjet printhead interface, as described in Section 10, configured with the following operating parameters:
P-0308[0308] MaxColors=4
P-0309[0309] SegmentsPerXfer=9
P-0310[0310] SegmentGroups=2
P-0311[0311] Although the printhead interface <b>192</b> has a number of external connections, not all are used for an 8.5″ printhead, so not all are connected to external pins on the CCP <b>180</b>. Specifically, the value for SegmentGroups implies that there are only 2 SRClock pins and 2 SenseSegSelect pins. All 36 ColorData pins, however, are required.
P-0312[0312] 7.3.1 Timing
P-0313[0313] CePrint <b>10</b> prints an 8.3″×11.7″ page in 2 seconds. The printhead <b>143</b> must therefore print 18,720 lines (11.7″×1600 dpi) in 2 seconds, which yields a line time of about 107 μs. Within the printhead interface <b>192</b>, a single Print Cycle and a single Load Cycle must both complete within this time. In addition, the paper <b>144</b> must advance by about 16 μm in the same time.
P-0314[0314] In high-speed print mode the Memjet printhead <b>143</b> can print an entire line in 100 μs. Since all segments fire at the same time 544 nozzles are fired simultaneously with each firing pulse. This leaves 7 μs for other tasks between each line.
P-0315[0315] The 1600 SRClock pulses (800 each of SRClock<b>1</b> and SRClock<b>2</b>) to the printhead <b>143</b> (SRClock<b>1</b> has 36 bits of valid data, and SRClock<b>2</b> has 32 bits of valid data) must also take place within the 107 μs line time. Restricting the timing to 100 μs, the length of an SRClock pulse cannot exceed 100 μs/1600=62.5 ns. The printhead <b>143</b> must therefore be clocked at 16 MHz.
P-0316[0316] The printhead interface <b>192</b> has a nominal pixel rate of 124M 4-bit CMYK pixels/s. However, because it is only active for 100 μs out of every 107 μs, it must be clocked at at least 140 MHz. This can be increased to 144 MHz to make it an integer multiple of the printhead speed.
P-0317[0317] 7.4 Processor and Memory
P-0318[0318] 7.4.1 Processor
P-0319[0319] The processor <b>181</b> runs the control program which synchronizes the other functional units during page reception, expansion and printing. It also runs the device drivers for the various external interfaces, and responds to user actions through the user interface.
P-0320[0320] It must have low interrupt latency, to provide efficient DMA management, but otherwise does not need to be particularly high-performance.
P-0321[0321] 7.4.2 DMA Controller
P-0322[0322] The DMA controller <b>200</b> supports single-address transfers on 29 channels (see Table 26). It generates vectored interrupts to the processor <b>181</b> on transfer completion. <tables id="TABLE-US-00028" num="28"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 26</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>DMA channel usage</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="56PT" align="center" /><colspec colname="3" colwidth="63PT" align="center" /><tbody valign="top"><row><entry /><entry>functional unit</entry><entry>input channels</entry><entry>output</entry></row><row><entry /><entry namest="OFFSET" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="56PT" align="char" char="." /><colspec colname="3" colwidth="63PT" align="char" char="." /><tbody valign="top"><row><entry /><entry>channels</entry><entry /><entry /></row><row><entry /><entry>host interface</entry><entry>—</entry><entry>1</entry></row><row><entry /><entry>inter-CCP interface</entry><entry>1</entry><entry>1</entry></row><row><entry /><entry>EDRL expander</entry><entry>1</entry><entry>1</entry></row><row><entry /><entry>JPEG decoder</entry><entry>1</entry><entry>8</entry></row><row><entry /><entry>halftoner/compositor</entry><entry>2</entry><entry>8</entry></row><row><entry /><entry>speaker interface</entry><entry>1</entry><entry>—</entry></row><row><entry /><entry>printhead interface</entry><entry>4</entry><entry>—</entry></row><row><entry /><entry /><entry>10</entry><entry>19</entry></row><row><entry /><entry /><entry /><entry>29</entry></row><row><entry /><entry namest="OFFSET" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0323[0323] 7.4.3 Program ROM
P-0324[0324] A program ROM <b>298</b> holds the CCP <b>180</b> control program which is loaded into main memory <b>182</b> during system boot.
P-0325[0325] 7.4.4 Rambus Interface
P-0326[0326] The Rambus interface <b>198</b> provides the high-speed interface to the external 8 MB (64 Mbit) Rambus DRAM (RDRAM) <b>182</b>.
P-0327[0327] 7.5 External Interfaces
P-0328[0328] 7.5.1 Host Interface
P-0329[0329] The host interface <b>194</b> provides a connection to the host processor with a speed of at least 1.5 MB/s (or 3 MB/s for the double-sided version of CePrint).
P-0330[0330] 7.5.2 Speaker Interface
P-0331[0331] A speaker interface <b>300</b> (FIG. 29) contains a small FIFO <b>302</b> used for DMA-mediated transfers of sound clips from main memory <b>182</b>, an 8-bit digital-to-analog converter (DAC) <b>304</b> which converts each 8-bit sample value to a voltage, and an amplifier <b>306</b> which feeds an external speaker <b>308</b> (FIG. 18). When the FIFO <b>302</b> is empty it outputs a zero value.
P-0332[0332] The speaker interface <b>300</b> is clocked at the frequency of the sound clips.
P-0333[0333] The processor <b>181</b> outputs a sound clip to the speaker <b>308</b> simply by programming the DMA channel of the speaker interface <b>300</b>.
P-0334[0334] 7.5.3 Parallel Interface
P-0335[0335] A parallel interface <b>309</b> provides I/O on a number of parallel external signal lines. It allows the processor <b>181</b> to sense or control the devices listed in Table 27. <tables id="TABLE-US-00029" num="29"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 27</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Parallel Interface devices</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>parallel interface devices</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row><row><entry /><entry>power button</entry></row><row><entry /><entry>power LED</entry></row><row><entry /><entry>out-of-paper LED</entry></row><row><entry /><entry>out-of-ink LED</entry></row><row><entry /><entry>media sensor</entry></row><row><entry /><entry>paper pick-up roller position sensor</entry></row><row><entry /><entry>paper tray drive position sensor</entry></row><row><entry /><entry>paper pick-up motor</entry></row><row><entry /><entry>paper tray ejector motor</entry></row><row><entry /><entry>transfer roller stepper motor</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0336[0336] 7.5.4 Serial Interface
P-0337[0337] A serial interface <b>310</b> provides two standard low-speed serial ports. One port is used to connect to the master QA chip <b>184</b>. The other is used to connect to a QA chip <b>312</b> in the ink cartridge. The processor-mediated protocol between the two is used to authenticate the ink cartridge. The processor <b>181</b> can then retrieve ink characteristics from the QA chip <b>312</b>, as well as the remaining volume of each ink. The processor <b>181</b> uses the ink characteristics to properly configure the Memjet printhead <b>143</b>. It uses the remaining ink volumes, updated on a page-by-page basis with ink consumption information accumulated by the printhead interface <b>192</b>, to ensure that it never allows the printhead <b>143</b> to be damaged by running dry.
P-0338[0338] 7.5.4.1 Ink Cartridge QA Chip
P-0339[0339] The QA chip <b>312</b> in the ink cartridge <b>32</b> contains information required for maintaining the best possible print quality, and is implemented using an authentication chip. The 256 bits of data in the authentication chip are allocated as follows: <tables id="TABLE-US-00030" num="30"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 28</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Ink cartridge's 256 bits (16 entries of 16-bits)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="35PT" align="center" /><colspec colname="2" colwidth="28PT" align="left" /><colspec colname="3" colwidth="28PT" align="center" /><colspec colname="4" colwidth="126PT" align="left" /><tbody valign="top"><row><entry>M[n]</entry><entry>access</entry><entry>width</entry><entry>description</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row><row><entry>0</entry><entry>RO<sup>a</sup></entry><entry>16</entry><entry>Basic header, flags etc.</entry></row><row><entry>1</entry><entry>RO</entry><entry>16</entry><entry>Serial number.</entry></row><row><entry>2</entry><entry>RO</entry><entry>16</entry><entry>Batch number.</entry></row><row><entry>3</entry><entry>RO</entry><entry>16</entry><entry>Reserved for future expansion. Must be 0.</entry></row><row><entry>4</entry><entry>RO</entry><entry>16</entry><entry>Cyan ink properties.</entry></row><row><entry>5</entry><entry>RO</entry><entry>16</entry><entry>Magenta ink properties.</entry></row><row><entry>6</entry><entry>RO</entry><entry>16</entry><entry>Yellow ink properties.</entry></row><row><entry>7</entry><entry>RO</entry><entry>16</entry><entry>Black ink properties.</entry></row><row><entry> 8-9</entry><entry>DO<sup>b</sup></entry><entry>32</entry><entry>Cyan ink remaining, in nanoliters.</entry></row><row><entry> 10-11</entry><entry>DO</entry><entry>32</entry><entry>Magenta ink remaining, in nanoliters.</entry></row><row><entry> 12-13</entry><entry>DO</entry><entry>32</entry><entry>Yellow ink remaining, in nanoliters.</entry></row><row><entry> 14-15</entry><entry>DO</entry><entry>32</entry><entry>Black ink remaining, in nanoliters.</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0340[0340] Before each page is printed, the processor <b>181</b> must check the amount of ink remaining to ensure there is enough for an entire worst-case page. Once the page has been printed, the processor <b>181</b> multiplies the total number of drops of each color (obtained from the printhead interface <b>192</b>) by the drop volume. The amount of printed ink is subtracted from the amount of ink remaining. The unit of measurement for ink remaining is nanolitres, so 32 bits can represent over 4 liters of ink. The amount of ink used for a page must be rounded up to the nearest nanolitre (i.e. approximately 1000 printed dots).
P-0341[0341] 7.5.5 Inter-CCP Interface
P-0342[0342] An inter-CCP interface <b>314</b> provides a bi-directional high-speed serial communications link to a second CCP, and is used in multi-CCP configurations such as the double-sided version of the printer which contains two CCPs.
P-0343[0343] The link has a minimum speed of 30 MB/s, to support timely distribution of page data, and may be implemented using a technology such as IEEE 1394 or Rambus.
P-0344[0344] 7.5.6 JTAG Interface
P-0345[0345] A standard JTAG (Joint Test Action Group) interface (not shown) is included for testing purposes. Due to the complexity of the chip, a variety of testing techniques are required, including BIST (Built In Self Test) and functional block isolation. An overhead of 10% in chip area is assumed for overall chip testing circuitry.
P-0346[0346] 8 Double-Sided Printing
P-0347[0347] The double-sided version of CePrint contains two complete print engines or printing units <b>140</b>—one for the front of the paper, one for the back. Each printing unit <b>140</b> consists of a printer controller <b>178</b>, a printhead assembly <b>142</b> containing a Memjet printhead <b>143</b>, and a transfer roller <b>68</b>. Both printing units <b>140</b> share the same ink supply. The back side, or lower, printing unit <b>140</b> acts as the master unit. It is responsible for global printer functions, such as communicating with the host, handling the ink cartridge <b>32</b>, handling the user interface, and controlling the paper transport. The front side, or upper, printing unit <b>140</b> acts as a slave unit. It obtains pages from the host processor via the master unit, and is synchronized by the master unit during printing.
P-0348[0348] Both printer controllers <b>178</b> consist of a CePrint central processor (CCP) <b>180</b> and a local 8 MB RDRAM <b>182</b>. The external interfaces of the master unit are used in the same way as in the single-sided version of CePrint, but only the memory interface <b>198</b> and the printhead interface <b>192</b> of the slave unit are used. An external master/slave pin on the CCP <b>180</b> selects the mode of operation.
P-0349[0349] This dual printer controller configuration is illustrated in FIG. 30.
P-0350[0350] 8.1 Page Delivery and Distribution
P-0351[0351] The master CCP <b>180</b>M (FIG. 30) presents a unified view of the printer <b>10</b> to the host processor. It hides the presence of the slave CCP <b>180</b>S.
P-0352[0352] Pages are transmitted from the host processor to the printer <b>10</b> in page order. The first page of a document is always a front side page, and front side and back side pages are always interleaved. Thus odd-numbered pages are front side pages, and even-numbered pages are back side pages. To print in single-sided mode on either the front side or back side of the paper, the host must send appropriate blank pages to the printer <b>10</b>. The printer <b>10</b> expects a page description for every page.
P-0353[0353] When the master CCP <b>180</b>M receives a page command from the host processor relating to an odd-numbered page it routes the command to the slave CCP <b>180</b>S via the inter-CCP serial link <b>314</b>. To avoid imposing undue restrictions on the host link and its protocol, each command is received in its entirety and stored in the master's local memory <b>182</b>M before being forwarded to the memory <b>182</b>S of the slave. This introduces only a small delay because the inter-CCP link <b>314</b> is fast. To ensure that the master CCP <b>180</b>M always has a page buffer available for a page destined for the slave, the master is deliberately made the back side CCP, so that it receives the front side odd-numbered page before it receives the matching back side even-numbered page.
P-0354[0354] 8.2 Synchronized Printing
P-0355[0355] Once the master CCP <b>180</b>M and the slave CCP <b>180</b>S have received their pages, the master CCP <b>180</b>M initiates actual printing. This consists of starting the page expansion and printing processes in the master CCP <b>180</b>M, and initiating the same processes in the slave CCP <b>180</b>S via a command sent over the inter-CCP serial link <b>314</b>.
P-0356[0356] To achieve perfect registration between the front side and back side printed pages, the printhead interfaces <b>192</b> of both CCPs are synchronized to a common line synchronization signal. The synchronization signal is generated by the master CCP <b>180</b>M.
P-0357[0357] Once the printing pipelines in both CCPs are sufficiently primed, as indicated by the stall status of the line loader/format unit (LLFU) of the printhead interface (Section 10.4), the master CCP <b>180</b>M starts the line synchronization generator unit (LSGU) of the printhead interface <b>192</b> (Section 10.2). The master CCP <b>180</b>M obtains the status of the slave CCP <b>180</b>S LLFU via a poll sent over the inter-CCP serial link <b>314</b>.
P-0358[0358] After the printing of a page, or more frequently, the master <b>180</b>M obtains ink consumption information from the slave <b>180</b>S over the inter-CCP link <b>314</b>. It uses this to update the remaining ink volume in the ink cartridge <b>32</b>, as described in Section 7.5.4.1.
P-0359[0359] The master and slave CCPs <b>180</b>M, <b>180</b>S also exchange error events and host-initiated printer reset commands over the inter-CCP link <b>314</b>.
P-0360[0360] 9 Memjet Printhead
P-0361[0361] The Memjet printhead <b>143</b> is a drop-on-demand 1600 dpi inkjet printer that produces bi-level dots in up to 4 colors to produce a printed page of a particular width. Since the printhead prints dots at 1600 dpi, each dot is approximately 22.5 mm in diameter, and spaced 15.875 mm apart. Because the printing is bi-level, the input image should be dithered or error-diffused for best results.
P-0362[0362] Typically a Memjet printhead for a particular application is page-width. This enables the printhead <b>143</b> to be stationary and allows the paper <b>144</b> to move past the printhead <b>143</b>. FIG. 31 illustrates a typical configuration.
P-0363[0363] The Memjet printhead <b>143</b> is composed of a number of identical ½ inch Memjet segments. The segment is therefore the basic building block for constructing the printhead <b>143</b>.
P-0364[0364] 9.1 The Structure of a Memjet Segment
P-0365[0365] This section examines the structure of a single segment, the basic building block for constructing the Memjet printhead <b>143</b>.
P-0366[0366] 9.1.1 Grouping of Nozzles Within a Segment
P-0367[0367] The nozzles within a single segment are grouped for reasons of physical stability as well as minimization of power consumption during printing. In terms of physical stability, a total of 10 nozzles share the same ink reservoir. In terms of power consumption, groupings are made to enable a low-speed and a high-speed printing mode. Memjet segments support two printing speeds to allow speed/power consumption trade-offs to be made in different product configurations.
P-0368[0368] In the low-speed printing mode, 4 nozzles of each color are fired from the segment at a time. The exact number of nozzles fired depends on how many colors are present in the printhead. In a four color (e.g. CMYK) printing environment this equates to 16 nozzles firing simultaneously. In a three color (e.g. CMY) printing environment this equates to 12 nozzles firing simultaneously. To fire all the nozzles in a segment, 200 different sets of nozzles must be fired.
P-0369[0369] In the high-speed printing mode, 8 nozzles of each color are fired from the segment at a time. The exact number of nozzles fired depends on how many colors are present in the printhead. In a four color (e.g. CMYK) printing environment this equates to 32 nozzles firing simultaneously. In a three color (e.g. CMY) printing environment this equates to 24 nozzles firing simultaneously. To fire all the nozzles in a segment, 100 different sets of nozzles must be fired.
P-0370[0370] The power consumption in the low-speed mode is half that of the high-speed mode. Note, however, that the energy consumed to print a page is the same in both cases.
P-0371[0371] 9.1.1.1 Ten Nozzles Make a Pod
P-0372[0372] A single pod consists of 10 nozzles sharing a common ink reservoir. 5 nozzles are in one row, and 5 are in another. Each nozzle produces dots 22.5 mm in diameter spaced on a 15.875 mm grid to print at 1600 dpi. FIG. 32 shows the arrangement of a single pod, with the nozzles numbered according to the order in which they must be fired.
P-0373[0373] Although the nozzles are fired in this order, the relationship of nozzles and physical placement of dots on the printed page is different. The nozzles from one row represent the even dots from one line on the page, and the nozzles on the other row represent the odd dots from the adjacent line on the page. FIG. 33 shows the same pod with the nozzles numbered according to the order in which they must be loaded.
P-0374[0374] The nozzles within a pod are therefore logically separated by the width of 1 dot. The exact distance between the nozzles will depend on the properties of the Memjet firing mechanism. The printhead <b>143</b> is designed with staggered nozzles designed to match the flow of paper.
P-0375[0375] 9.1.1.2 One Pod of Each Color Makes a Chromapod
P-0376[0376] One pod of each color are grouped together into a chromapod. The number of pods in a chromapod will depend on the particular application. In a monochrome printing system (such as one that prints only black), there is only a single color and hence a single pod. Photo printing application printheads require 3 colors (cyan, magenta, yellow), so Memjet segments used for these applications will have 3 pods per chromapod (one pod of each color). The expected maximum number of pods in a chromapod is 4, as used in a CMYK (cyan, magenta, yellow, black) printing system (such as a desktop printer). This maximum of 4 colors is not imposed by any physical constraints—it is merely an expected maximum from the expected applications (of course, as the number of colors increases the cost of the segment increases and the number of these larger segments that can be produced from a single silicon wafer decreases).
P-0377[0377] A chromapod represents different color components of the same horizontal set of 10 dots on different lines. The exact distance between different color pods depends on the Memjet operating parameters, and may vary from one Memjet design to another. The distance is considered to be a constant number of dot-widths, and must therefore be taken into account when printing: the dots printed by the cyan nozzles will be for different lines than those printed by the magenta, yellow or black nozzles. The printing algorithm must allow for a variable distance up to about 8 dot-widths between colors. FIG. 34 illustrates a single chromapod for a CMYK printing application.
P-0378[0378] 9.1.1.3 Five Chromapods Make a Podgroup
P-0379[0379] Five chromapods are organized into a single podgroup. A podgroup therefore contains 50 nozzles for each color. The arrangement is shown in FIG. 35, with chromapods numbered <b>0</b>-<b>4</b> and using a CMYK chromapod as the example. Note that the distance between adjacent chromapods is exaggerated for clarity.
P-0380[0380] 9.1.1.4 Two Podgroups Make a Phasegroup
P-0381[0381] Two podgroups are organized into a single phasegroup. The phasegroup is so named because groups of nozzles within a phasegroup are fired simultaneously during a given firing phase (this is explained in more detail below). The formation of a phasegroup from 2 podgroups is entirely for the purposes of low-speed and high-speed printing via 2 PodgroupEnable lines.
P-0382[0382] During low-speed printing, only one of the two PodgroupEnable lines is set in a given firing pulse, so only one podgroup of the two fires nozzles. During high-speed printing, both PodgroupEnable lines are set, so both podgroups fire nozzles. Consequently a low-speed print takes twice as long as a high-speed print, since the high-speed print fires twice as many nozzles at once.
P-0383[0383]FIG. 36 illustrates the composition of a phasegroup. The distance between adjacent podgroups is exaggerated for clarity.
P-0384[0384] 9.1.1.5 Two Phasegroups Make a Firegroup
P-0385[0385] Two phasegroups (PhasegroupA and PhasegroupB) are organized into a single firegroup, with 4 firegroups in each segment. Firegroups are so named because they all fire the same nozzles simultaneously. Two enable lines, AEnable and BEnable, allow the firing of PhasegroupA nozzles and PhasegroupB nozzles independently as different firing phases. The arrangement is shown in FIG. 37. The distance between adjacent groupings is exaggerated for clarity.
P-0386[0386] 9.1.1.6 Nozzle Grouping Summary
P-0387[0387] Table 29 is a summary of the nozzle groupings in a segment assuming a CMYK chromapod. <tables id="TABLE-US-00031" num="31"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 29</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Nozzle Groupings for a single segment</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="49PT" align="left" /><colspec colname="2" colwidth="91PT" align="left" /><colspec colname="3" colwidth="49PT" align="center" /><colspec colname="4" colwidth="28PT" align="center" /><tbody valign="top"><row><entry>Name of</entry><entry /><entry>Replication</entry><entry>Nozzle</entry></row><row><entry>Grouping</entry><entry>Composition</entry><entry>Ratio</entry><entry>Count</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row><row><entry>Nozzle</entry><entry>Base unit</entry><entry>1:1</entry><entry>1</entry></row><row><entry>Pod</entry><entry>Nozzles per pod</entry><entry>10:1 </entry><entry>10</entry></row><row><entry>Chromapod</entry><entry>Pods per chromapod</entry><entry>C:1<sup> </sup></entry><entry>10 C</entry></row><row><entry>Podgroup</entry><entry>Chromapods per podgroup</entry><entry>5:1</entry><entry>50 C</entry></row><row><entry>Phasegroup</entry><entry>Podgroups per phasegroup</entry><entry>2:1</entry><entry>100 C </entry></row><row><entry>Firegroup</entry><entry>Phasegroups per firegroup</entry><entry>2:1</entry><entry>200 C </entry></row><row><entry>Segment</entry><entry>Firegroups per segment</entry><entry>4:1</entry><entry>800 C </entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0388[0388] 9.1.2 Load and Print Cycles
P-0389[0389] A single segment contains a total of 800C nozzles, where C is the number of colors in the segment. A Print Cycle involves the firing of up to all of these nozzles, dependent on the information to be printed. A Load Cycle involves the loading up of the segment with the information to be printed during the subsequent Print Cycle.
P-0390[0390] Each nozzle has an associated NozzleEnable bit that determines whether or not the nozzle will fire during the Print Cycle. The NozzleEnable bits (one per nozzle) are loaded via a set of shift registers.
P-0391[0391] Logically there are C shift registers per segment (one per color), each 800 deep. As bits are shifted into the shift register for a given color they are directed to the lower and upper nozzles on alternate pulses. Internally, each 800-deep shift register is comprised of two 400-deep shift registers: one for the upper nozzles, and one for the lower nozzles. Alternate bits are shifted into the alternate internal registers. As far as the external interface is concerned however, there is a single 800 deep shift register.
P-0392[0392] Once all the shift registers have been fully loaded (800 load pulses), all of the bits are transferred in parallel to the appropriate NozzleEnable bits. This equates to a single parallel transfer of 800C bits. Once the transfer has taken place, the Print Cycle can begin. The Print Cycle and the Load Cycle can occur simultaneously as long as the parallel load of all NozzleEnable bits occurs at the end of the Print Cycle.
P-0393[0393] 9.1.2.1 Load Cycle
P-0394[0394] The Load Cycle is concerned with loading the segment's shift registers with the next Print Cycle's NozzleEnable bits.
P-0395[0395] Each segment has C inputs directly related to the C shift registers (where C is the number of colors in the segment). These inputs are named ColorNData, where N is 1 to C (for example, a 4 color segment would have 4 inputs labeled Color<b>1</b>Data, Color<b>2</b>Data, Color<b>3</b>Data and Color<b>4</b>Data). A single pulse on the SRClock line transfers C bits into the appropriate shift registers. Alternate pulses transfer bits to the lower and upper nozzles respectively. A total of 800 pulses are required for the complete transfer of data. Once all 800C bits have been transferred, a single pulse on the PTransfer line causes the parallel transfer of data from the shift registers to the appropriate NozzleEnable bits.
P-0396[0396] The parallel transfer via a pulse on PTransfer must take place after the Print Cycle has finished. Otherwise the NozzleEnable bits for the line being printed will be incorrect.
P-0397[0397] It is important to note that the odd and even dot outputs, although printed during the same Print Cycle, do not appear on the same physical output line. The physical separation of odd and even nozzles within the printhead, as well as separation between nozzles of different colors ensures that they will produce dots on different lines of the page. This relative difference must be accounted for when loading the data into the printhead <b>143</b>. The actual difference in lines depends on the characteristics of the inkjet mechanism used in the printhead <b>143</b>. The differences can be defined by variables D<sub>1 </sub>and D<sub>2 </sub>where D<sub>1 </sub>is the distance between nozzles of different colors, and D<sub>2 </sub>is the distance between nozzles of the same color.
P-0398[0398] Table 30 shows the dots transferred to a C color segment on the first 4 pulses. <tables id="TABLE-US-00032" num="32"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 30</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Order of Dots Transferred to a Segment</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="6"><colspec colname="1" colwidth="28PT" align="center" /><colspec colname="2" colwidth="21PT" align="center" /><colspec colname="3" colwidth="35PT" align="left" /><colspec colname="4" colwidth="35PT" align="left" /><colspec colname="5" colwidth="42PT" align="left" /><colspec colname="6" colwidth="56PT" align="left" /><tbody valign="top"><row><entry /><entry /><entry>Color1</entry><entry>Color2</entry><entry>Color3</entry><entry>ColorC</entry></row><row><entry>Pulse</entry><entry>Dot</entry><entry>Line</entry><entry>Line</entry><entry>Line</entry><entry>Line</entry></row><row><entry namest="1" nameend="6" align="center" rowsep="1" /></row><row><entry>1</entry><entry>0</entry><entry>N</entry><entry>N + D<sub>1</sub><sup>a</sup></entry><entry>N + 2D<sub>1</sub></entry><entry>N +</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry>(C − 1)D<sub>1</sub></entry></row><row><entry>2</entry><entry>1</entry><entry>N + D<sub>2</sub><sup>b</sup></entry><entry>N + D<sub>1</sub> +</entry><entry>N + 2D<sub>1</sub> +</entry><entry>N +</entry></row><row><entry /><entry /><entry /><entry>D<sub>2</sub></entry><entry>D<sub>2</sub></entry><entry>(C − 1)D<sub>1</sub> + D<sub>2</sub></entry></row><row><entry>3</entry><entry>2</entry><entry>N</entry><entry>N + D<sub>1</sub></entry><entry>N + 2D<sub>1</sub></entry><entry>N +</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry>(C − 1)D<sub>1</sub></entry></row><row><entry>4</entry><entry>3</entry><entry>N + D<sub>2</sub></entry><entry>N + D<sub>1</sub> +</entry><entry>N + 2D<sub>1</sub> +</entry><entry>N +</entry></row><row><entry /><entry /><entry /><entry>D<sub>2</sub></entry><entry>D<sub>2</sub></entry><entry>(C − 1)D<sub>1</sub> + D<sub>2</sub></entry></row><row><entry namest="1" nameend="6" align="center" rowsep="1" /></row><row><entry namest="1" nameend="6" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="6" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="6" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="6" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0399[0399] 9.1.2.2 Print Cycle
P-0400[0400] A single Memjet printhead segment contains 800 nozzles. To fire them all at once would consume too much power and be problematic in terms of ink refill and nozzle interference. This problem is made more apparent when we consider that a Memjet printhead is composed of multiple ½ inch segments, each with 800 nozzles. Consequently two firing modes are defined: a low-speed printing mode and a high-speed printing mode:
P-0401[0401] In the low-speed print mode, there are 200 phases, with each phase firing 4C nozzles (C per firegroup, where C is the number of colors).
P-0402[0402] In the high-speed print mode, there are 100 phases, with each phase firing 8C nozzles, (2C per firegroup, where C is the number of colors).
P-0403[0403] The nozzles to be fired in a given firing pulse are determined by
P-0404[0404] 3 bits ChromapodSelect (select 1 of 5 chromapods from a firegroup)
P-0405[0405] 4 bits NozzleSelect (select 1 of 10 nozzles from a pod)
P-0406[0406] 2 bits of PodgroupEnable lines (select 0, 1, or 2 podgroups to fire)
P-0407[0407] When one of the PodgroupEnable lines is set, only the specified Podgroup's 4 nozzles will fire as determined by ChromapodSelect and NozzleSelect. When both of the PodgroupEnable lines are set, both of the podgroups will fire their nozzles. For the low-speed mode, two fire pulses are required, with PodgroupEnable=10 and 01 respectively. For the high-speed mode, only one fire pulse is required, with PodgroupEnable=11.
P-0408[0408] The duration of the firing pulse is given by the AEnable and BEnable lines, which fire the PhasegroupA and PhasegroupB nozzles from all firegroups respectively. The typical duration of a firing pulse is 1.3-1.8 ms. The duration of a pulse depends on the viscosity of the ink (dependent on temperature and ink characteristics) and the amount of power available to the printhead <b>143</b>. See Section 9.1.3 for details on feedback from the printhead <b>143</b> in order to compensate for temperature change.
P-0409[0409] The AEnable and BEnable are separate lines in order that the firing pulses can overlap. Thus the 200 phases of a low-speed Print Cycle consist of 100 A phases and 100 B phases, effectively giving 100 sets of Phase A and Phase B. Likewise, the 100 phases of a high-speed print cycle consist of 50 A phases and 50 B phases, effectively giving 50 phases of phase A and phase B.
P-0410[0410]FIG. 38 shows the AEnable and BEnable lines during a typical Print Cycle. In a high-speed print there are 50 2 ms cycles, while in a low-speed print there are 100 2 μs cycles.
P-0411[0411] For the high-speed printing mode, the firing order is:
P-0412[0412] ChromapodSelect <b>0</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0413[0413] ChromapodSelect <b>1</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0414[0414] ChromapodSelect <b>2</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0415[0415] ChromapodSelect <b>3</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0416[0416] ChromapodSelect <b>4</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0417[0417] ChromapodSelect <b>0</b>, NozzleSelect <b>1</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0418[0418] . . .
P-0419[0419] ChromapodSelect <b>3</b>, NozzleSelect <b>9</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0420[0420] ChromapodSelect <b>4</b>, NozzleSelect <b>9</b>, PodgroupEnable <b>11</b> (Phases A and B)
P-0421[0421] For the low-speed printing mode, the firing order is similar. For each phase of the high speed mode where PodgroupEnable was <b>11</b>, two phases of PodgroupEnable=01 and 10 are substituted as follows:
P-0422[0422] ChromapodSelect <b>0</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>01</b> (Phases A and B)
P-0423[0423] ChromapodSelect <b>0</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>10</b> (Phases A and B)
P-0424[0424] ChromapodSelect <b>1</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>01</b> (Phases A and B)
P-0425[0425] ChromapodSelect <b>1</b>, NozzleSelect <b>0</b>, PodgroupEnable <b>10</b> (Phases A and B)
P-0426[0426] . . .
P-0427[0427] ChromapodSelect <b>3</b>, NozzleSelect <b>9</b>, PodgroupEnable <b>01</b> (Phases A and B)
P-0428[0428] ChromapodSelect <b>3</b>, NozzleSelect <b>9</b>, PodgroupEnable <b>10</b> (Phases A and B)
P-0429[0429] ChromapodSelect <b>4</b>, NozzleSelect <b>9</b>, PodgroupEnable <b>01</b> (Phases A and B)
P-0430[0430] ChromapodSelect <b>4</b>, NozzleSelect <b>9</b>, PodgroupEnable <b>10</b> (Phases A and B)
P-0431[0431] When a nozzle fires, it takes approximately 100 μs to refill. The nozzle cannot be fired before this refill time has elapsed. This limits the fastest printing speed to 100 μs per line. In the high-speed print mode, the time to print a line is 100 μs, so the time between firing a nozzle from one line to the next matches the refill time. The low-speed print mode is slower than this, so is also acceptable.
P-0432[0432] The firing of a nozzle also causes acoustic perturbations for a limited time within the common ink reservoir of that nozzle's pod. The perturbations can interfere with the firing of another nozzle within the same pod. Consequently, the firing of nozzles within a pod should be offset from each other as long as possible. We therefore fire four nozzles from a chromapod (one nozzle per color) and then move onto the next chromapod within the podgroup.
P-0433[0433] In the low-speed printing mode the podgroups are fired separately. Thus the 5 chromapods within both podgroups must all fire before the first chromapod fires again, totalling 10×2 μs cycles. Consequently each pod is fired once per 20 μs.
P-0434[0434] In the high-speed printing mode, the podgroups are fired together. Thus the 5 chromapods within a single podgroups must all fire before the first chromapod fires again, totalling 5×2 μs cycles. Consequently each pod is fired once per 10 μs.
P-0435[0435] As the ink channel is 300 mm long and the velocity of sound in the ink is around 1500 m/s, the resonant frequency of the ink channel is 2.5 MHz. Thus the low-speed mode allows 50 resonant cycles for the acoustic pulse to dampen, and the high-speed mode allows 25 resonant cycles. Consequently any acoustic interference is minimal in both cases.
P-0436[0436] 9.1.3 Feedback from a Segment
P-0437[0437] A segment produces several lines of feedback. The feedback lines are used to adjust the timing of the firing pulses. Since multiple segments are collected together into a printhead, it is effective to share the feedback lines as a tri-state bus, with only one of the segments placing the feedback information on the feedback lines.
P-0438[0438] A pulse on the segment's SenseSegSelect line ANDed with data on Color<b>1</b>Data selects if the particular segment will provide the feedback. The feedback sense lines will come from that segment until the next SenseSegSelect pulse. The feedback sense lines are as follows:
P-0439[0439] Tsense informs the controller how hot the printhead is. This allows the controller to adjust timing of firing pulses, since temperature affects the viscosity of the ink.
P-0440[0440] Vsense informs the controller how much voltage is available to the actuator. This allows the controller to compensate for a flat battery or high voltage source by adjusting the pulse width.
P-0441[0441] Rsense informs the controller of the resistivity (Ohms per square) of the actuator heater. This allows the controller to adjust the pulse widths to maintain a constant energy irrespective of the heater resistivity.
P-0442[0442] Wsense informs the controller of the width of the critical part of the heater, which may vary up to ±5% due to lithographic and etching variations. This allows the controller to adjust the pulse width appropriately.
P-0443[0443] 9.1.4 Preheat Cycle
P-0444[0444] The printing process has a strong tendency to stay at the equilibrium temperature. To ensure that the first section of a printed image, such as a photograph, has a consistent dot size, the equilibrium temperature must be met before printing any dots. This is accomplished via a preheat cycle.
P-0445[0445] The Preheat cycle involves a single Load Cycle to all nozzles of a segment with 1 s (i.e. setting all nozzles to fire), and a number of short firing pulses to each nozzle. The duration of the pulse must be insufficient to fire the drops, but enough to heat up the ink. Altogether about 200 pulses for each nozzle are required, cycling through in the same sequence as a standard Print Cycle.
P-0446[0446] Feedback during the Preheat mode is provided by Tsense, and continues until equilibrium temperature is reached (about 30° C. above ambient). The duration of the Preheat mode is around 50 milliseconds, and depends on the ink composition.
P-0447[0447] Preheat is performed before each print job. This does not affect performance as it is done while the data is being transferred to the printer.
P-0448[0448] 9.1.5 Cleaning Cycle
P-0449[0449] In order to reduce the chances of nozzles becoming clogged, a cleaning cycle can be undertaken before each print job. Each nozzle is fired a number of times into an absorbent sponge.
P-0450[0450] The cleaning cycle involves a single Load Cycle to all nozzles of a segment with is (i.e. setting all nozzles to fire), and a number of firing pulses to each nozzle. The nozzles are cleaned via the same nozzle firing sequence as a standard Print Cycle. The number of times that each nozzle is fired depends upon the ink composition and the time that the printer has been idle. As with preheat, the cleaning cycle has no effect on printer performance.
P-0451[0451] 9.1.6 Printhead Interface Summary
P-0452[0452] Each segment has the following connections to the bond pads: <tables id="TABLE-US-00033" num="33"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 31</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Segment Interface Connections</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="28PT" align="center" /><colspec colname="3" colwidth="119PT" align="left" /><tbody valign="top"><row><entry>Name</entry><entry>Lines</entry><entry>Description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="28PT" align="char" char="." /><colspec colname="3" colwidth="119PT" align="left" /><tbody valign="top"><row><entry>Chromapod Select</entry><entry>3</entry><entry>Select which chromapod will</entry></row><row><entry /><entry /><entry>fire (0-4)</entry></row><row><entry>NozzleSelect</entry><entry>4</entry><entry>Select which nozzle from the</entry></row><row><entry /><entry /><entry>pod will fire (0-9)</entry></row><row><entry>PodgroupEnable</entry><entry>2</entry><entry>Enable the podgroups to fire</entry></row><row><entry /><entry /><entry>(choice of: 01, 10, 11)</entry></row><row><entry>AEnable</entry><entry>1</entry><entry>Firing pulse for podgroup A</entry></row><row><entry>BEnable</entry><entry>1</entry><entry>Firing pulse for podgroup B</entry></row><row><entry>ColorNData</entry><entry>C</entry><entry>Input to shift registers</entry></row><row><entry /><entry /><entry>(1 bit for each of C colors</entry></row><row><entry /><entry /><entry>in the segment)</entry></row><row><entry>SRClock</entry><entry>1</entry><entry>A pulse on SRClock</entry></row><row><entry /><entry /><entry>(ShiftRegisterClock) loads C</entry></row><row><entry /><entry /><entry>bits from ColorData into the</entry></row><row><entry /><entry /><entry>C shift registers.</entry></row><row><entry>PTransfer</entry><entry>1</entry><entry>Parallel transfer of data from</entry></row><row><entry /><entry /><entry>the shift registers to the internal</entry></row><row><entry /><entry /><entry>NozzleEnable bits (one per nozzle).</entry></row><row><entry>SenseSegSelect</entry><entry>1</entry><entry>A pulse on SenseSegSelect ANDed</entry></row><row><entry /><entry /><entry>with data on Color1Data selects</entry></row><row><entry /><entry /><entry>the sense lines for this segment.</entry></row><row><entry>Tsense</entry><entry>1</entry><entry>Temperature sense</entry></row><row><entry>Vsense</entry><entry>1</entry><entry>Voltage sense</entry></row><row><entry>Rsense</entry><entry>1</entry><entry>Resistivity sense</entry></row><row><entry>Wsense</entry><entry>1</entry><entry>Width sense</entry></row><row><entry>Logic GND</entry><entry>1</entry><entry>Logic ground</entry></row><row><entry>Logic PWR</entry><entry>1</entry><entry>Logic power</entry></row><row><entry>V−</entry><entry>21</entry><entry>Actuator Ground</entry></row><row><entry>V+</entry><entry>21</entry><entry>Actuator Power</entry></row><row><entry>TOTAL</entry><entry>62 + C</entry><entry>(if C is 4, Total = 66)</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0453[0453] 9.2 Making Memjet Printheads Out of Segments
P-0454[0454] A Memjet printhead is composed of a number of identical ½ inch printhead segments. These ½ inch segments are manufactured together or placed together after manufacture to produce a printhead of the desired length. Each ½ inch segments prints 800 1600 dpi bi-level dots in up to 4 colors over a different part of the page to produce the final image. Although each segment produces 800 dots of the final image, each dot is represented by a combination of colored inks.
P-0455[0455] A 4-inch printhead, for example, consists of 8 segments, typically manufactured as a monolithic printhead. In a typical 4-color printing application (cyan, magenta, yellow, black), each of the segments prints bi-level cyan, magenta, yellow and black dots over a different part of the page to produce the final image.
P-0456[0456] An 8-inch printhead can be constructed from two 4-inch printheads or from a single 8-inch printhead consisting of 16 segments. Regardless of the construction mechanism, the effective printhead is still 8 inches in length.
P-0457[0457] A 2-inch printhead has a similar arrangement, but only uses 4 segments. Likewise, a full-bleed A4/Letter printer uses 17 segments for an effective 8.5 inch printing area.
P-0458[0458] Since the total number of nozzles in a segment is 800C (see Table 29), the total number of nozzles in a given printhead with S segments is 800CS. Thus segment N is responsible for printing dots 800N to 800N+799.
P-0459[0459] A number of considerations must be made when wiring up a printhead. As the width of the printhead increases, the number of segments increases, and the number of connections also increases. Each segment has its own ColorData connections (C of them), as well as SRClock and other connections for loading and printing.
P-0460[0460] 9.2.1 Loading Considerations
P-0461[0461] When the number of segments S is small it is reasonable to load all the segments simultaneously by using a common SRClock line and placing C bits of data on each of the ColorData inputs for the segments. In a 4-inch printer, S=8, and therefore the total number of bits to transfer to the printhead in a single SRClock pulse is 32. However for an 8-inch printer, S=16, and it is unlikely to be reasonable to have 64 data lines running from the print data generator to the printhead.
P-0462[0462] Instead, it is convenient to group a number of segments together for loading purposes. Each group of segments is small enough to be loaded simultaneously, and share an SRClock. For example, an 8-inch printhead can have 2 segment groups, each segment group containing 8 segments. 32 ColorData lines can be shared for both groups, with 2 SRClock lines, one per segment group.
P-0463[0463] When the number of segment groups is not easily divisible, it is still convenient to group the segments. One example is a 8.5 inch printer for producing A4/Letter pages. There are 17 segments, and these can be grouped as two groups of 9 (9C bits of data going to each segment, with all 9C bits used in the first group, and only 8C bits used for the second group), or as 3 groups of 6 (again, C bits are unused in the last group).
P-0464[0464] As the number of segment groups increases, the time taken to load the printhead increases. When there is only one group, 800 load pulses are required (each pulse transfers C data bits). When there are G groups, 800G load pulses are required. The bandwidth of the connection between the data generator and the printhead must be able to cope and be within the allowable timing parameters for the particular application.
P-0465[0465] If G is the number of segment groups, and L is the largest number of segments in a group, the printhead requires LC ColorData lines and G SRClock lines. Regardless of G, only a single PTransfer line is required—it can be shared across all segments.
P-0466[0466] Since L segments in each segment group are loaded with a single SRClock pulse, any printing process must produce the data in the correct sequence for the printhead. As an example, when G=2 and L=4, the first SRClock<b>1</b> pulse will transfer the ColorData bits for the next Print Cycle's dot <b>0</b>, <b>800</b>, <b>1600</b>, and <b>2400</b>. The first SRClock<b>2</b> pulse will transfer the ColorData bits for the next Print Cycle's dot <b>3200</b>, <b>4000</b>, <b>4800</b>, and <b>5600</b>. The second SRClock<b>1</b> pulse will transfer the ColorData bits for the next Print Cycle's dot <b>1</b>, <b>801</b>, <b>1601</b>, and <b>2401</b>. The second SRClock<b>2</b> pulse will transfer the ColorData bits for the next Print Cycle's dot <b>3201</b>, <b>4001</b>, <b>4801</b> and <b>5601</b>.
P-0467[0467] After 800G SRClock pulses (800 to each of SRClock<b>1</b> and SRClock<b>2</b>), the entire line has been loaded into the printhead, and the common PTransfer pulse can be given.
P-0468[0468] It is important to note that the odd and even color outputs, although printed during the same Print Cycle, do not appear on the same physical output line. The physical separation of odd and even nozzles within the printhead, as well as separation between nozzles of different colors ensures that they will produce dots on different lines of the page. This relative difference must be accounted for when loading the data into the printhead. The actual difference in lines depends on the characteristics of the inkjet mechanism used in the printhead. The differences can be defined by variables D<sub>1 </sub>and D<sub>2 </sub>where D<sub>1 </sub>is the distance between nozzles of different colors, and D<sub>2 </sub>is the distance between nozzles of the same color. Considering only a single segment group, Table 32 shows the dots transferred to segment n of a printhead during the first 4 pulses of the shared SRClock. <tables id="TABLE-US-00034" num="34"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 32</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Order of Dots Transferred to a Segment in a Printhead</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="28PT" align="center" /><colspec colname="2" colwidth="35PT" align="left" /><colspec colname="3" colwidth="49PT" align="left" /><colspec colname="4" colwidth="42PT" align="left" /><colspec colname="5" colwidth="63PT" align="left" /><tbody valign="top"><row><entry>Pulse</entry><entry>Dot</entry><entry>Color1 Line</entry><entry>Color2 Line</entry><entry>ColorC Line</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row><row><entry>1</entry><entry>800S<sup>a</sup></entry><entry>N</entry><entry>N + D<sub>1</sub><sup>b</sup></entry><entry>N + (C − 1)D<sub>1</sub></entry></row><row><entry>2</entry><entry>800S + 1</entry><entry>N + D<sub>2</sub><sup>c</sup></entry><entry>N + D<sub>1</sub> + D<sub>2</sub></entry><entry>N + (C − 1)D<sub>1</sub> + D<sub>2</sub></entry></row><row><entry>3</entry><entry>800S + 2</entry><entry>N</entry><entry>N + D<sub>1</sub></entry><entry>N + (C − 1)D<sub>1</sub></entry></row><row><entry>4</entry><entry>800S + 3</entry><entry>N + D<sub>2</sub></entry><entry>N + D<sub>1</sub> + D<sub>2</sub></entry><entry>N + (C − 1)D<sub>1</sub> + D<sub>2</sub></entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row><row><entry namest="1" nameend="5" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="5" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="5" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="5" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0469[0469] 9.2.2 Printing Considerations
P-0470[0470] With regards to printing, we print 4C nozzles from each segment in the low-speed printing mode, and 8C nozzles from each segment in the high speed printing mode.
P-0471[0471] While it is certainly possible to wire up segments in any way, we only consider the situation where all segments fire simultaneously. This is because the low-speed printing mode allows low-power printing for small printheads (e.g. 2-inch and 4-inch), and the controller chip design assumes there is sufficient power available for the large print sizes (such as 8-18 inches). It is a simple matter to alter the connections in the printhead <b>143</b> to allow grouping of firing should a particular application require it.
P-0472[0472] When all segments are fired at the same time 4CS nozzles are fired in the low-speed printing mode and 8CS nozzles are fired in the high-speed printing mode. Since all segments print simultaneously, the printing logic is the same as defined in Section 9.1.2.2.
P-0473[0473] The timing for the two printing modes is therefore:
P-0474[0474] 200 μs to print a line at low speed (comprised of 100 2 μs cycles)
P-0475[0475] 100 μs to print a line at high speed (comprised of 50 2 μs cycles)
P-0476[0476] 9.2.3 Feedback Considerations
P-0477[0477] A segment produces several lines of feedback, as defined in Section 9.1.3. The feedback lines are used to adjust the timing of the firing pulses. Since multiple segments are collected together into a printhead, it is effective to share the feedback lines as a tri-state bus, with only one of the segments placing the feedback information on the feedback lines at a time.
P-0478[0478] Since the selection of which segment will place the feedback information on the shared Tsense, Vsense, Rsense, and Wsense lines uses the Color<b>1</b>Data line, the groupings of segments for loading data can be used for selecting the segment for feedback. Just as there are G SRClock lines (a single line is shared between segments of the same segment group), there are G SenseSegSelect lines shared in the same way. When the correct SenseSegSelect line is pulsed, the segment of that group whose Color<b>1</b>Data bit is set will start to place data on the shared feedback lines. The segment previously active in terms of feedback must also be disabled by having a 0 on its Color<b>1</b>Data bit, and this segment may be in a different segment group. Therefore when there is more than one segment group, changing the feedback segment requires two steps: disabling the old segment, and enabling the new segment.
P-0479[0479] 9.2.4 Printhead Connection Summary
P-0480[0480] This section assumes that the printhead <b>143</b> has been constructed from a number of segments as described in the previous sections. It assumes that for data loading purposes, the segments have been grouped into G segment groups, with L segments in the largest segment group. It assumes there are C colors in the printhead. It assumes that the firing mechanism for the printhead <b>143</b> is that all segments fire simultaneously, and only one segment at a time places feedback information on a common tri-state bus. Assuming all these things, Table 33 lists the external connections that are available from a printhead: <tables id="TABLE-US-00035" num="35"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 33</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Printhead Connections</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="56PT" align="left" /><colspec colname="2" colwidth="49PT" align="center" /><colspec colname="3" colwidth="112PT" align="left" /><tbody valign="top"><row><entry>Name</entry><entry>#Pins</entry><entry>Description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>ChromapodSelect</entry><entry>3</entry><entry>Select which chromapod will</entry></row><row><entry /><entry /><entry>fire (0-4)</entry></row><row><entry>NozzleSelect</entry><entry>4</entry><entry>Select which nozzle from the</entry></row><row><entry /><entry /><entry>pod will fire (0-9)</entry></row><row><entry>PodgroupEnable</entry><entry>2</entry><entry>Enable the podgroups to fire</entry></row><row><entry /><entry /><entry>(choice of: 01, 10, 11)</entry></row><row><entry>AEnable</entry><entry>1</entry><entry>Firing pulse for phasegroup A</entry></row><row><entry>BEnable</entry><entry>1</entry><entry>Firing pulse for phasegroup B</entry></row><row><entry>ColorData</entry><entry>CL</entry><entry>Inputs to C shift registers of</entry></row><row><entry /><entry /><entry>segments 0 to L-1</entry></row><row><entry>SRClock</entry><entry>G</entry><entry>A pulse on SRClock[N]</entry></row><row><entry /><entry /><entry>(ShiftRegisterClock N) loads the</entry></row><row><entry /><entry /><entry>current values from ColorData</entry></row><row><entry /><entry /><entry>lines into the L segments in</entry></row><row><entry /><entry /><entry>segment group N.</entry></row><row><entry>PTransfer</entry><entry>1</entry><entry>Parallel transfer of data from</entry></row><row><entry /><entry /><entry>the shift registers to the internal</entry></row><row><entry /><entry /><entry>NozzleEnable bits (one per nozzle).</entry></row><row><entry>SenseSegSelect</entry><entry>G</entry><entry>A pulse on SenseSegSelect N ANDed</entry></row><row><entry /><entry /><entry>with data on Color1Data[n]</entry></row><row><entry /><entry /><entry>selects the sense lines for segment</entry></row><row><entry /><entry /><entry>n in segment group N.</entry></row><row><entry>Tsense</entry><entry>1</entry><entry>Temperature sense</entry></row><row><entry>Vsense</entry><entry>1</entry><entry>Voltage sense</entry></row><row><entry>Rsense</entry><entry>1</entry><entry>Resistivity sense</entry></row><row><entry>Wsense</entry><entry>1</entry><entry>Width sense</entry></row><row><entry>Logic GND</entry><entry>1</entry><entry>Logic ground</entry></row><row><entry>Logic PWR</entry><entry>1</entry><entry>Logic power</entry></row><row><entry>V−</entry><entry>Bus bars</entry><entry>Actuator Ground</entry></row><row><entry>V+</entry><entry /><entry>Actuator Power</entry></row><row><entry>TOTAL</entry><entry>18 + 2G + CL</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0481[0481] 10 Memjet Printhead Interface
P-0482[0482] The printhead interface (PHI) <b>192</b> is the means by which the processor <b>181</b> loads the Memjet printhead <b>143</b> with the dots to be printed, and controls the actual dot printing process. The PHI <b>192</b> contains:
P-0483[0483] a LineSyncGen unit (LSGU), which provides synchronization signals for multiple chips (allows side-by-side printing and front/back printing) as well as stepper motors.
P-0484[0484] a Memjet interface (MJI), which transfers data to the Memjet printhead, and controls the nozzle firing sequences during a print.
P-0485[0485] a line loader/format unit (LLFU) which loads the dots for a given print line into local buffer storage and formats them into the order required for the Memjet printhead.
P-0486[0486] The units within the PHI <b>192</b> are controlled by a number of registers that are programmed by the processor <b>181</b>. In addition, the processor <b>181</b> is responsible for setting up the appropriate parameters in the DMA controller <b>200</b> for the transfers from memory to the LLFU. This includes loading white (all 0's) into appropriate colors during the start and end of a page so that the page has clean edges.
P-0487[0487] The PHI <b>192</b> is capable of dealing with a variety of printhead lengths and formats. In terms of broad operating customizations, the PHI <b>192</b> is parameterized as follows: <tables id="TABLE-US-00036" num="36"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 34</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Basic Printing Parameters</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="63PT" align="left" /><colspec colname="2" colwidth="119PT" align="left" /><colspec colname="3" colwidth="35PT" align="center" /><tbody valign="top"><row><entry>Name</entry><entry>Description</entry><entry>Range</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>MaxColors</entry><entry>No of Colors in printhead</entry><entry>1-4</entry></row><row><entry>SegmentsPerXfer</entry><entry>No of segments written to per transfer.</entry><entry>1-9</entry></row><row><entry /><entry>Is equal to the number of</entry></row><row><entry /><entry>segments in the largest segment group</entry></row><row><entry>SegmentGroups</entry><entry>No of segment groups in printhead</entry><entry>1-4</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0488[0488] The internal structure of the PHI allows for a maximum of 4 colors, 9 segments per transfer, and 4 transfers. Transferring 4 colors to 9 segments is 36 bits per transfer, and 4 transfers to 9 segments equates to a maximum printed line length of 18 inches. The total number of dots per line printed by an 18-inch 4 color printhead is 115,200 (18×1600×4).
P-0489[0489] Other example settings are shown in Table 35: <tables id="TABLE-US-00037" num="37"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="294PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 35</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Example Settings for Basic Printing Parameters</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="7"><colspec colname="1" colwidth="56PT" align="left" /><colspec colname="2" colwidth="63PT" align="left" /><colspec colname="3" colwidth="28PT" align="center" /><colspec colname="4" colwidth="35PT" align="center" /><colspec colname="5" colwidth="35PT" align="center" /><colspec colname="6" colwidth="21PT" align="center" /><colspec colname="7" colwidth="56PT" align="left" /><tbody valign="top"><row><entry /><entry /><entry /><entry>Segments-</entry><entry /><entry /><entry /></row><row><entry /><entry /><entry>Max-</entry><entry>Per-</entry><entry>Segment-</entry></row><row><entry>Printer Length</entry><entry>Printer Type</entry><entry>Colors</entry><entry>Xfer</entry><entry>Groups</entry><entry>Bits</entry><entry>Comments</entry></row><row><entry namest="1" nameend="7" align="center" rowsep="1" /></row><row><entry>4-inch CMY</entry><entry>Photo</entry><entry>3</entry><entry>8</entry><entry>1</entry><entry>24</entry><entry /></row><row><entry>8-inch CMYK</entry><entry>A4/Letter</entry><entry>4</entry><entry>8</entry><entry>2</entry><entry>32</entry></row><row><entry>8.5 inch CMYK</entry><entry>A4/Letter full bleed</entry><entry>4</entry><entry>9</entry><entry>2</entry><entry>36</entry><entry>Last xfer not fully</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>used</entry></row><row><entry>12 inch CMYK</entry><entry>A4 long/A3 short</entry><entry>4</entry><entry>8</entry><entry>3</entry><entry>32</entry></row><row><entry>16 inch CMYK</entry><entry /><entry>4</entry><entry>8</entry><entry>4</entry><entry>32</entry></row><row><entry>17 inch CMYK</entry><entry>A3 long full bleed</entry><entry>4</entry><entry>9</entry><entry>4</entry><entry>36</entry><entry>Last xfer not fully</entry></row><row><entry /><entry /><entry /><entry /><entry /><entry /><entry>used</entry></row><row><entry>18 inch CMYK</entry><entry /><entry>4</entry><entry>9</entry><entry>4</entry><entry>36</entry></row><row><entry namest="1" nameend="7" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0490[0490] 10.1 Block Diagram of Printhead Interface
P-0491[0491] The internal structure of the Printhead Interface <b>192</b> is shown in FIG. 39.
P-0492[0492] In the PHI <b>192</b> there are two LSGUs <b>316</b>, <b>318</b>. The first LSGU <b>316</b> produces LineSync<b>0</b>, which is used to control the Memjet Interface <b>320</b> in all synchronized chips. The second LSGU <b>318</b> produces LineSync<b>1</b> which is used to pulse the paper drive stepper motor.
P-0493[0493] The Master/Slave pin on the chip allows multiple chips to be connected together for side-by-side printing, front/back printing etc. via a Master/Slave relationship. When the Master/Slave pin is attached to VDD, the chip is considered to be the Master, and LineSync pulses generated by the two LineSyncGen units <b>316</b>, <b>318</b> are enabled onto the two tri-state LineSync common lines (LineSync<b>0</b> and LineSync<b>1</b>, shared by all the chips). When the Master/Slave pin is attached to GND, the chip is considered to be the Slave, and LineSync pulses generated by the two LineSyncGen units <b>316</b>, <b>318</b> are not enabled onto the common LineSync lines. In this way, the Master chip's LineSync pulses are used by all PHIs <b>192</b> on all the connected chips.
P-0494[0494] The following sections detail the LineSyncGen Unit <b>316</b>, <b>318</b>, the Line Loader/Format Unit <b>322</b> and Memjet Interface <b>320</b> respectively.
P-0495[0495] 10.2 LineSyncGen Unit
P-0496[0496] The LineSyncGen units (LSGU) <b>316</b>, <b>318</b> are responsible for generating the synchronization pulses required for printing a page. Each LSGU <b>316</b>, <b>318</b> produces an external LineSync signal to enable line synchronization. The generator inside the LGSU <b>316</b>, <b>318</b> generates a LineSync pulse when told to ‘go’, and then every so many cycles until told to stop. The LineSync pulse defines the start of the next line.
P-0497[0497] The exact number of cycles between LineSync pulses is determined by the CyclesBetweenPulses register, one per generator. It must be at least long enough to allow one line to print (100 μs or 200 ms depending on whether the speed is low or high) and another line to load, but can be longer as desired (for example, to accommodate special requirements of paper transport circuitry). If the CyclesBetweenPulses register is set to a number less than a line print time, the page will not print properly since each LineSync pulse will arrive before the particular line has finished printing.
P-0498[0498] The following interface registers are contained in each LSGU <b>316</b>, <b>318</b>: <tables id="TABLE-US-00038" num="38"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="273PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 36</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>LineSyncGen Unit Registers</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="203PT" align="left" /><tbody valign="top"><row><entry>Register Name</entry><entry>Description</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>CyclesBetweenPulses</entry><entry>The number of cycles to wait between generating one LineSync</entry></row><row><entry /><entry>pulse and the next.</entry></row><row><entry>Go</entry><entry>Controls whether the LSGU is currently generating LineSync pulses</entry></row><row><entry /><entry>or not.</entry></row><row><entry /><entry>A write of 1 to this register generates a LineSync pulse, transfers</entry></row><row><entry /><entry>CyclesBetweenPulses to CyclesRemaining, and starts the</entry></row><row><entry /><entry>countdown. When CyclesRemaining hits 0, another LineSync pulse</entry></row><row><entry /><entry>is generated, CyclesBetweenPulses is transferred to</entry></row><row><entry /><entry>CyclesRemaining and the countdown is started again.</entry></row><row><entry /><entry>A write of 0 to this register stops the countdown and no more</entry></row><row><entry /><entry>LineSync pulses are generated.</entry></row><row><entry>CyclesRemaining</entry><entry>A status register containing the number of cycles remaining until the</entry></row><row><entry /><entry>next LineSync pulse is generated.</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0499[0499] The LineSync pulse is not used directly from the LGSU <b>316</b>, <b>318</b>. The LineSync pulse is enabled onto a tri-state LineSync line only if the Master/Slave pin is set to Master. Consequently the LineSync pulse is only used in the form as generated by the Master chip (pulses generated by Slave chips are ignored).
P-0500[0500] 10.3 Memjet Interface
P-0501[0501] The Memjet interface (MJI) <b>320</b> transfers data to the Memjet printhead <b>143</b>, and controls the nozzle firing sequences during a print.
P-0502[0502] The MJI <b>320</b> is simply a State Machine (see FIG. 40) which follows the printhead loading and firing order described in Section 9.2.1, Section 9.2.2, and includes the functionality of the Preheat Cycle and Cleaning Cycle as described in Section 9.1.4 and Section 9.1.5. Both high-speed and low-speed printing modes are available, although the MJI <b>320</b> always fires a given nozzle from all segments in a printhead simultaneously (there is no separate firing of nozzles from one segment and then others). Dot counts for each color are also kept by the MJI <b>320</b>.
P-0503[0503] The MJI loads data into the printhead from a choice of 2 data sources:
P-0504[0504] All 1s. This means that all nozzles will fire during a subsequent Print cycle, and is the standard mechanism for loading the printhead for a preheat or cleaning cycle.
P-0505[0505] From the 36-bit input held in the Transfer register of the LLFU <b>322</b>. This is the standard means of printing an image. The 36-bit value from the LLFU <b>322</b> is directly sent to the printhead and a 1-bit ‘Advance’ control pulse is sent to the LLFU <b>322</b>.
P-0506[0506] The MJI <b>320</b> knows how many lines it has to print for the page. When the MJI <b>320</b> is told to ‘go’, it waits for a LineSync pulse before it starts the first line. Once it has finished loading/printing a line, it waits until the next LineSync pulse before starting the next line. The MJI <b>320</b> stops once the specified number of lines has been loaded/printed, and ignores any further LineSync pulses.
P-0507[0507] The MJI <b>320</b> is therefore directly connected to the LLFU <b>322</b>, LineSync<b>0</b> (shared between all synchronized chips), and the external Memjet printhead <b>143</b>.
P-0508[0508] The MJI <b>320</b> accepts 36 bits of data from the LLFU <b>322</b>. Of these 36 bits, only the bits corresponding to the number of segments and number of colors will be valid. For example, if there are only 2 colors and 9 segments, bits <b>0</b>-<b>1</b> will be valid for segment <b>0</b>, bits <b>2</b>-<b>3</b> will be invalid, bits <b>4</b>-<b>5</b> will be valid for segment <b>1</b>, bits <b>6</b>-<b>7</b> will be invalid etc. The state machine does not care which bits are valid and which bits are not valid—it merely passes the bits out to the printhead <b>143</b>. The data lines and control signals coming out of the MJI <b>320</b> can be wired appropriately to the pinouts of the chip, using as few pins as required by the application range of the chip (see Section 10.3.1 for more information).
P-0509[0509] 10.3.1 Connections to Printhead
P-0510[0510] The MJI <b>320</b> has a number of connections to the printhead <b>143</b>, including a maximum of 4 colors, clocked in to a maximum of 9 segments per transfer to a maximum of 4 segment groups. The lines coming from the MJI <b>320</b> can be directly connected to pins on the chip, although not all lines will always be pins. For example, if the chip is specifically designed for only connecting to 8 inch CMYK printers, only 32 bits of data need to be transferred each transfer pulse. Consequently 32 pins of data out (8 pins per color), and not 36 pins are required. In the same way, only 2 SRClock pulses are required, so only 2 pins instead of 4 pins are required to cater for the different SRClocks. And so on.
P-0511[0511] If the chip must be completely generic, then all connections from the MJI <b>320</b> must be connected to pins on the chip (and thence to the Memjet printhead <b>143</b>).
P-0512[0512] Table 37 lists the maximum connections from the MJI <b>320</b>, many of which are always connected to pins on the chip. Where the number of pins is variable, a footnote explains what the number of pins depends upon. The sense of input and output is with respect to the MJI <b>320</b>. The names correspond to the pin connections on the printhead <b>143</b>. <tables id="TABLE-US-00039" num="39"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="273PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 37</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Memjet Interface Connections</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="21PT" align="center" /><colspec colname="3" colwidth="14PT" align="left" /><colspec colname="4" colwidth="168PT" align="left" /><tbody valign="top"><row><entry>Name</entry><entry>#Pins</entry><entry>I/O</entry><entry>Description</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="21PT" align="char" char="." /><colspec colname="3" colwidth="14PT" align="left" /><colspec colname="4" colwidth="168PT" align="left" /><tbody valign="top"><row><entry>Chromapod Select</entry><entry>3</entry><entry>O</entry><entry>Select which chromapod will fire (0-4)</entry></row><row><entry>NozzleSelect</entry><entry>4</entry><entry>O</entry><entry>Select which nozzle from the pod will fire (0-9)</entry></row><row><entry>PodgroupEnable</entry><entry>2</entry><entry>O</entry><entry>Enable the podgroups to fire (choice of: 01, 10, 11)</entry></row><row><entry>AEnable</entry><entry>1</entry><entry>O</entry><entry>Firing pulse for podgroup A. In the current design all</entry></row><row><entry /><entry /><entry /><entry>segments fire simultaneously, although multiple AEnable</entry></row><row><entry /><entry /><entry /><entry>lines could be added for dividing the firing sequence over</entry></row><row><entry /><entry /><entry /><entry>multiple segment groups for reasons of power and speed.</entry></row><row><entry>BEnable</entry><entry>1</entry><entry>O</entry><entry>Firing pulse for podgroup B. In the current design all</entry></row><row><entry /><entry /><entry /><entry>segments fire simultaneously, although multiple BEnable</entry></row><row><entry /><entry /><entry /><entry>lines could be added for dividing the firing sequence over</entry></row><row><entry /><entry /><entry /><entry>multiple segment groups for reasons of power and speed.</entry></row><row><entry>Color1Data[0-8]</entry><entry>9<sup>a</sup></entry><entry>O</entry><entry>Output to Color1Data shift register of segments 0-8</entry></row><row><entry>Color2Data[0-8]</entry><entry>9<sup>b</sup></entry><entry>O</entry><entry>Output to Color2Data shift register of segments 0-8</entry></row><row><entry>Color3Data[0-8]</entry><entry>9<sup>c</sup></entry><entry>O</entry><entry>Output to Color3Data shift register of segments 0-8</entry></row><row><entry>Color4Data[0-8]</entry><entry>9<sup>d</sup></entry><entry>O</entry><entry>Output to Color4Data shift register of segments 0-8</entry></row><row><entry>SRClock[1-4]</entry><entry>4<sup>e</sup></entry><entry>O</entry><entry>A pulse on SRClock[N] (ShiftRegisterClock) loads the</entry></row><row><entry /><entry /><entry /><entry>current values from Color1Data[0-8], Color2Data[0-8],</entry></row><row><entry /><entry /><entry /><entry>Color3Data[0-8] and Color4Data[0-8] into the segment</entry></row><row><entry /><entry /><entry /><entry>group N on the printhead.</entry></row><row><entry>PTransfer</entry><entry>1</entry><entry>O</entry><entry>Parallel transfer of data from the shift registers to the</entry></row><row><entry /><entry /><entry /><entry>printhead's internal NozzleEnable bits (one per nozzle).</entry></row><row><entry>SenseSegSelect[1-4]</entry><entry>4<sup>f</sup></entry><entry>O</entry><entry>A pulse on SenseSegSelect[N] ANDed with data on</entry></row><row><entry /><entry /><entry /><entry>Color1Data[n] enables the sense lines for segment n in</entry></row><row><entry /><entry /><entry /><entry>segment group N of the printhead.</entry></row><row><entry>Tsense</entry><entry>1</entry><entry>I</entry><entry>Temperature sense</entry></row><row><entry>Vsense</entry><entry>1</entry><entry>I</entry><entry>Voltage sense</entry></row><row><entry>Rsense</entry><entry>1</entry><entry>I</entry><entry>Resistivity sense</entry></row><row><entry>Wsense</entry><entry>1</entry><entry>I</entry><entry>Width sense</entry></row><row><entry>TOTAL</entry><entry>52</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row><row><entry namest="1" nameend="4" align="left"><!--footnotes removed--></entry></row></tbody></tgroup></table></tables>
P-0513[0513] 10.3.2 Firing Pulse Duration
P-0514[0514] The duration of firing pulses on the AEnable and BEnable lines depend on the viscosity of the ink (which is dependant on temperature and ink characteristics) and the amount of power available to the printhead <b>143</b>. The typical pulse duration range is 1.3 to 1.8 μs. The MJI <b>320</b> therefore contains a programmable pulse duration table <b>324</b> (FIG. 41), indexed by feedback from the printhead <b>143</b>. The table <b>324</b> of pulse durations allows the use of a lower cost power supply, and aids in maintaining more accurate drop ejection.
P-0515[0515] The Pulse Duration table <b>324</b> has 256 entries, and is indexed by the current Vsense and Tsense settings on lines <b>326</b> and <b>328</b>, respectively. The upper 4-bits of address come from Vsense, and the lower 4-bits of address come from Tsense. Each entry is 8 bits, and represents a fixed point value in the range of 0-4 ms. The process of generating the AEnable and BEnable lines is shown in FIG. 41.
P-0516[0516] The 256-byte table <b>324</b> is written by the processor <b>181</b> before printing the first page. The table <b>324</b> may be updated in between pages if desired. Each 8-bit pulse duration entry in the table <b>324</b> combines:
P-0517[0517] User brightness settings (from the page description)
P-0518[0518] Viscosity curve of ink (from the QA Chip)
P-0519[0519] Rsense
P-0520[0520] Wsense
P-0521[0521] Vsense
P-0522[0522] Tsense
P-0523[0523] 10.3.3 Dot Counts
P-0524[0524] The MJI <b>320</b> maintains a count of the number of dots of each color fired from the printhead <b>143</b>. The dot count for each color is a 32-bit value, individually cleared under processor control. At 32-bits length, each dot count can hold a maximum coverage dot count of 17 8-inch×12-inch pages, although in typical usage, the dot count will be read and cleared after each page or half-page.
P-0525[0525] The dot counts are used by the processor <b>181</b> to update the QA chip <b>312</b> (see Section 7.5.4) in order to predict when the ink cartridge <b>32</b> runs out of ink. The processor <b>181</b> knows the volume of ink in the cartridge <b>32</b> for each of the colors from the QA chip <b>312</b>. Counting the number of drops eliminates the need for ink sensors, and prevents the ink channels from running dry. An updated drop count is written to the QA chip <b>312</b> after each page. A new page will not be printed unless there is enough ink left, and allows the user to change the ink without getting a dud half-printed page which must be reprinted.
P-0526[0526] The layout of the dot counter for Color<b>1</b> is shown in FIG. 42. The remaining 3 dot counters (Color<b>1</b>DotCount, Color<b>2</b>DotCount, and Color<b>3</b>DotCount) are identical in structure.
P-0527[0527] 10.3.4 Registers
P-0528[0528] The processor <b>181</b> communicates with the MJI <b>320</b> via a register set. The registers allow the processor <b>181</b> to parameterize a print as well as receive feedback about print progress.
P-0529[0529] The following registers are contained in the MJI <b>320</b>: <tables id="TABLE-US-00040" num="40"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="287PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 38</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Memjet Interface Registers</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>Register Name</entry><entry>Description</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="287PT" align="left" /><tbody valign="top"><row><entry>Print Parameters</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>SegmentsPerXfer</entry><entry>The number of segments to write to each transfer. This also equals the</entry></row><row><entry /><entry>number of cycles to wait between each transfer (before generating the next</entry></row><row><entry /><entry>Advance pulse). Each transfer has MaxColors × SegmentsPerXfer valid</entry></row><row><entry /><entry>bits.</entry></row><row><entry>SegmentGroups</entry><entry>The number of segment groups in the printhead. This equals the number</entry></row><row><entry /><entry>of times that SegmentsPerXfer cycles must elapse before a single dot has</entry></row><row><entry /><entry>been written to each segment of the printhead. The MJI does this 800</entry></row><row><entry /><entry>times to completely transfer all the data for the line to the printhead.</entry></row><row><entry>PrintSpeed</entry><entry>Whether to print at low or high speed (determines the value on the</entry></row><row><entry /><entry>PodgroupEnable lines during the print).</entry></row><row><entry>NumLines</entry><entry>The number of Load/Print cycles to perform.</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="287PT" align="left" /><tbody valign="top"><row><entry>Monitoring the Print (read only from point of view of processor)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>Status</entry><entry>The Memjet Interface's Status Register</entry></row><row><entry>LinesRemaining</entry><entry>The number of lines remaining to be printed. Only valid while Go = 1.</entry></row><row><entry /><entry>Starting value is NumLines and counts down to 0.</entry></row><row><entry>TransfersRemaining</entry><entry>The number of sets of SegmentGroups transfers remaining before the</entry></row><row><entry /><entry>Printhead is considered loaded for the current line. Starts at 800 and</entry></row><row><entry /><entry>counts down to 0. Only valid while Go = 1 .</entry></row><row><entry>SegGroupsRemaining</entry><entry>The number of segment groups remaining in the current set of transfers of</entry></row><row><entry /><entry>1 dot to each segment. Starts at SegmentGroups and counts down to 0.</entry></row><row><entry /><entry>Only valid while Go = 1.</entry></row><row><entry>SenseSegment</entry><entry>The 9-bit value to place on the Color1Data lines during a subsequent</entry></row><row><entry /><entry>feedback SenseSegSelect pulse. Only 1 of the 9 bits should be set,</entry></row><row><entry /><entry>corresponding to one of the (maximum) 9 segments. See SenseSelect for</entry></row><row><entry /><entry>how to determine which of the segment groups to sense.</entry></row><row><entry>SetAllNozzles</entry><entry>If non-zero, the 36-bit value written to the printhead during the LoadDots</entry></row><row><entry /><entry>process is all 1s, so that all nozzles will be fired during the subsequent</entry></row><row><entry /><entry>PrintDots process. This is used during the preheat and cleaning cycles.</entry></row><row><entry /><entry>If 0, the 36-bit value written to the printhead comes from the LLFU. This</entry></row><row><entry /><entry>is the case during the actual printing of regular images.</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="287PT" align="left" /><tbody valign="top"><row><entry>Actions</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>Reset</entry><entry>A write to this register resets the MJT, stops any loading or printing</entry></row><row><entry /><entry>processes, and loads all registers with 0.</entry></row><row><entry>SenseSelect</entry><entry>A write to this register with any value clears the FeedbackValid bit of the</entry></row><row><entry /><entry>Status register, and the remaining action depends on the values in the</entry></row><row><entry /><entry>LoadingDots and PrintingDots status bits.</entry></row><row><entry /><entry>If either of the status bits are set, the Feedback bit is cleared and nothing</entry></row><row><entry /><entry>more is done.</entry></row><row><entry /><entry>If both status bits are clear, a pulse is given simultaneously on all 4</entry></row><row><entry /><entry>SenseSegSelect lines with all ColorData bits 0. This stops any existing</entry></row><row><entry /><entry>feedback. Depending on the two low-order bits written to SenseSelect</entry></row><row><entry /><entry>register, a pulse is given on SenseSegSelect1, SenseSegSelect2,</entry></row><row><entry /><entry>SenseSegSelect3, or SenseSegSelect4 line, with the Color1Data bits set</entry></row><row><entry /><entry>according to the SenseSegment register. Once the various sense lines have</entry></row><row><entry /><entry>been tested, the values are placed in the Tsense, Vsense, Rsense, and</entry></row><row><entry /><entry>Wsense registers, and the Feedback bit of the Status register is set.</entry></row><row><entry>Go</entry><entry>A write of 1 to this bit starts the LoadDots/PrintDots cycles, which</entry></row><row><entry /><entry>commences with a wait for the first LineSync pulse. A total of NumLines</entry></row><row><entry /><entry>lines are printed, each line being loaded/printed after the receipt of a</entry></row><row><entry /><entry>LineSync pulse. The loading of each line consists of SegmentGroups 36-</entry></row><row><entry /><entry>bit transfers. As each line is printed, LinesRemaining decrements, and</entry></row><row><entry /><entry>TransfersRemaining is reloaded with SegmentGroups again. The status</entry></row><row><entry /><entry>register contains print status information. Upon completion of NumLines,</entry></row><row><entry /><entry>the loading/printing process stops, the Go bit is cleared, and any further</entry></row><row><entry /><entry>LineSync pulses are ignored. During the final print cycle, nothing is</entry></row><row><entry /><entry>loaded into the printhead.</entry></row><row><entry /><entry>A write of 0 to this bit stops the print process, but does not clear any other</entry></row><row><entry /><entry>registers.</entry></row><row><entry>ClearCounts</entry><entry>A write to this register clears the Color1DotCount, Color2DotCount,</entry></row><row><entry /><entry>Color3DotCount, and Color4DotCount registers if bits 0, 1, 2, or 3</entry></row><row><entry /><entry>respectively are set. Consequently a write of 0 has no effect.</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="287PT" align="left" /><tbody valign="top"><row><entry>Feedback</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="70PT" align="left" /><colspec colname="2" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>Tsense</entry><entry>Read only feedback of Tsense from the last SenseSegSelect pulse sent to</entry></row><row><entry /><entry>segment SenseSegment. Is only valid if the FeedbackValid bit of the</entry></row><row><entry /><entry>Status register is set.</entry></row><row><entry>Vsense</entry><entry>Read only feedback of Vsense from the last SenseSegSelect pulse sent to</entry></row><row><entry /><entry>segment SenseSegment. Is only valid if the FeedbackValid bit of the</entry></row><row><entry /><entry>Status register is set.</entry></row><row><entry>Rsense</entry><entry>Read only feedback of Rsense from the last SenseSegSelect pulse sent to</entry></row><row><entry /><entry>segment SenseSegment. Is only valid if the FeedbackValid bit of the</entry></row><row><entry /><entry>Status register is set.</entry></row><row><entry>Wsense</entry><entry>Read only feedback of Wsense from the last SenseSegSelect pulse sent to</entry></row><row><entry /><entry>segment SenseSegment. Is only valid if the FeedbackValid bit of the</entry></row><row><entry /><entry>Status register is set.</entry></row><row><entry>Color1DotCount</entry><entry>Read only 32-bit count of color1 dots sent to the printhead.</entry></row><row><entry>Color2DotCount</entry><entry>Read only 32-bit count of color2 dots sent to the printhead.</entry></row><row><entry>Color3DotCount</entry><entry>Read only 32-bit count of color3 dots sent to the printhead</entry></row><row><entry>Color4DotCount</entry><entry>Read only 32-bit count of color4 dots sent to the printhead</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0530[0530] The MJI's Status Register is a 16-bit register with bit interpretations as follows: <tables id="TABLE-US-00041" num="41"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="287PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 39</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>MJI Status Register</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="1" colwidth="91PT" align="left" /><colspec colname="2" colwidth="21PT" align="center" /><colspec colname="3" colwidth="175PT" align="left" /><tbody valign="top"><row><entry>Name</entry><entry>Bits</entry><entry>Description</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row><row><entry>LoadingDots</entry><entry>1</entry><entry>If set, the MJI is currently loading dots, with the number of</entry></row><row><entry /><entry /><entry>dots remaining to be transferred in TransfersRemaining.</entry></row><row><entry /><entry /><entry>If clear, the MJI is not currently loading dots</entry></row><row><entry>PrintingDots</entry><entry>1</entry><entry>If set, the MJI is currently printing dots.</entry></row><row><entry /><entry /><entry>If clear, the MJI is not currently printing dots.</entry></row><row><entry>PrintingA</entry><entry>1</entry><entry>This bit is set while there is a pulse on the AEnable line</entry></row><row><entry>PrintingB</entry><entry>1</entry><entry>This bit is set while there is a pulse on the BEnable line</entry></row><row><entry>FeedbackValid</entry><entry>1</entry><entry>This bit is set while the feedback values Tsense, Vsense,</entry></row><row><entry /><entry /><entry>Rsense, and Wsense are valid.</entry></row><row><entry>Reserved</entry><entry>3</entry><entry>—</entry></row><row><entry>PrintingChromapod</entry><entry>4</entry><entry>This holds the current chromapod being fired while the</entry></row><row><entry>PrintingDots status bit is set.</entry></row><row><entry>PrintingNozzles</entry><entry>4</entry><entry>This holds the current nozzle being fired while the</entry></row><row><entry /><entry /><entry>PrintingDots status bit is set.</entry></row><row><entry namest="1" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0531[0531] The following pseudocode illustrates the logic required to load a printhead for a single line. Note that loading commences only after the LineSync pulse arrives. This is to ensure the data for the line has been prepared by the LLFU <b>322</b> and is valid for the first transfer to the printhead <b>143</b>. <tables id="TABLE-US-00042" num="42"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>Wait for LineSync</entry></row><row><entry /><entry>For TransfersRemaining = 800 to 0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>For I = 0 to SegmentGroups</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>If (SetAllNozzles)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>Set all ColorData lines to be 1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>Else</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>Place 36 bit input on 36 ColorData lines</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>EndIf</entry></row><row><entry /><entry>Pulse SRClock[I]</entry></row><row><entry /><entry>Wait SegmentsPerXfer cycles</entry></row><row><entry /><entry>Send ADVANCE signal</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>EndFor</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>EndFor</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0532[0532] 10.3.5 Preheat and Cleaning Cycles
P-0533[0533] The Cleaning and Preheat cycles are simply accomplished by setting appropriate registers in the MJI <b>320</b>:
P-0534[0534] SetAllNozzles=1
P-0535[0535] Set the PulseDuration register to either a low duration (in the case of the preheat mode) or to an appropriate drop ejection duration for cleaning mode.
P-0536[0536] Set NumLines to be the number of times the nozzles should be fired
P-0537[0537] Set the Go bit and then wait for the Go bit to be cleared when the print cycles have completed.
P-0538[0538] The LSGU <b>316</b>, <b>318</b> must also be programmed to send LineSync pulses at the correct frequency.
P-0539[0539] 10.4 Line Loader/Format Unit
P-0540[0540] The line loader/format unit (LLFU <b>322</b> loads the dots for a given print line into local buffer storage and formats them into the order required for the Memjet printhead <b>143</b>. It is responsible for supplying the pre-calculated nozzleEnable bits to the Memjet interface <b>320</b> for the eventual printing of the page.
P-0541[0541] The printing uses a double buffering scheme for preparing and accessing the dot-bit information. While one line is being loaded into the first buffer, the pre-loaded line in the second buffer is being read in Memjet dot order. Once the entire line has been transferred from the second buffer to the printhead <b>143</b> via the Memjet interface <b>320</b>, the reading and writing processes swap buffers. The first buffer is now read and the second buffer is loaded up with the new line of data. This is repeated throughout the printing process, as can be seen in the conceptual overview of FIG. 43.
P-0542[0542] The size of each buffer is 14 KBytes to cater for the maximum line length of 18 inches in 4 colors (18×1600×4 bits=115,200 bits=14,400 bytes). The size for both Buffer <b>0</b> (<b>330</b>—FIG. 44) and Buffer <b>1</b> (<b>332</b>) is 28.128 KBytes. While this design allows for a maximum print length of 18 inches, it is trivial to reduce the buffer size to target a specific application.
P-0543[0543] Since one buffer <b>330</b>, <b>332</b> is being read from while the other is being written to, two sets of address lines must be used. The 32-bits DataIn <b>334</b> from the common data bus <b>186</b> are loaded depending on the WriteEnables, which are generated by State Machine <b>336</b> in response to the DMA Acknowledges.
P-0544[0544] A multiplexor <b>338</b> chooses between the two 4-bit outputs of Buffer <b>0</b> and Buffer <b>1</b>, and sends the result to a 9-entry by 4-bit shift register <b>340</b>. After a maximum of 9 read cycles (the number depends on the number of segments written to per transfer), and whenever an Advance pulse comes from the MJI <b>320</b>, the current 36-bit value from the shift register <b>340</b> is gated into a 36-bit Transfer register <b>342</b>, where it can be used by the MJI <b>320</b>.
P-0545[0545] Note that not all the 36 bits are necessarily valid. The number of valid bits of 36 depends on the number of colors in the printhead <b>143</b>, the number of segments, and the breakup of segment groups (if more than one segment group). For more information, see Section 9.2.
P-0546[0546] A single line in an L-inch C-color printhead consists of 1600L C-color dots. At 1 bit per colored dot, a single print-line consists of 1600LC bits. The LLFU <b>322</b> is capable of addressing a maximum line size of 18 inches in 4 colors, which equates to 108,800 bits (14 KBytes) per line. These bits must be supplied to the MJI <b>320</b> in the correct order for being sent on to the printhead 143. See Section 9.2.1 for more information concerning the Load Cycle dot loading order, but in summary, 2LC bits are transferred to the printhead <b>143</b> in SegmentGroups transfers, with a maximum of 36 bits per transfer. Each transfer to a particular segment of the printhead <b>143</b> must load all colors simultaneously.
P-0547[0547] 10.4.1 Buffers
P-0548[0548] Each of the two buffers <b>330</b>, <b>332</b> is broken into 4 sub-buffers, 1 per color. The size of each sub-buffer is 3600 bytes, enough to hold 18-inches of single color dots at 1600 dpi. The memory is accessed 32-bits at a time, so there are 900 addresses for each buffer (requiring 10 bits of address).
P-0549[0549] All the even dots are placed before the odd dots in each color's buffer, as shown in FIG. 45. If there is any unused space it is placed at the end of each color's buffer.
P-0550[0550] The amount of memory actually used is directly related to the printhead length. If the printhead is 18 inches, there are 1800 bytes of even dots followed by 1800 bytes of odd dots, with no unused space. If the printhead is 12 inches, there are 1200 bytes of even dots followed by 1200 odd dots, and 1200 bytes unused.
P-0551[0551] The number of sub-buffers gainfully used is directly related to the number of colors in the printhead. This number is typically 3 or 4, although it is quite feasible for this system to be used in a 1 or 2 color system (with some small memory wastage). In a desktop printing environment, the number of colors would be 4: Color<b>1</b>=Cyan, Color<b>2</b>=Magenta, Color<b>3</b>=Yellow, Color<b>4</b>=Black.
P-0552[0552] The address decoding circuitry is such that in a given cycle, a single 32-bit access can be made to all 4 sub-buffers—either a read from all 4 or a write to one of the 4. Only one bit of the 32-bits read from each color buffer is selected, for a total of 4 output bits. The process is shown in FIG. 46. 15 bits of address allow the reading of a particular bit by means of 10-bits of address being used to select 32 bits, and 5-bits of address choose 1-bit from those 32. Since all color buffers share this logic, a single 15-bit address gives a total of 4 bits out, one per color. Each buffer has its own WriteEnable line, to allow a single 32-bit value to be written to a particular color buffer in a given cycle. The 32-bits of DataIn are shared, since only one buffer will actually clock the data in.
P-0553[0553] Note that regardless of the number of colors in the printhead, 4 bits are produced in a given read cycle (one bit from each color's buffer).
P-0554[0554] 10.4.2 Address Generation
P-0555[0555] 10.4.2.1 Reading
P-0556[0556] Address Generation for reading is straightforward. Each cycle we generate a bit address which is used to fetch 4 bits representing 1-bit per color for a particular segment. By adding 400 to the current bit address, we advance to the next segment's equivalent dot. We add 400 (not 800) since the odd and even dots are separated in the buffer. We do this firstly SegmentGroups sets of SegmentsPerXfer times to retrieve the data representing the even dots (the dot data is transferred to the MJI 36 bits at a time) and another SegmentGroups sets of SegmentsPerXfer times to load the odd dots. This entire process is repeated 400 times, incrementing the start address each time. Thus all dot values are transferred in the order required by the printhead in 400×2×SegmentGroups×SegmentsPerXfer cycles.
P-0557[0557] In addition, we generate the TransferWriteEnable control signal. Since the LLFU <b>322</b> starts before the MJI <b>320</b>, we must transfer the first value before the Advance pulse from the MJI <b>320</b>. We must also generate the next value in readiness for the first Advance pulse. The solution is to transfer the first value to the Transfer register after SegmentsPerXfer cycles, and then to stall SegmentsPerXfer-cycles later, waiting for the Advance pulse to start the next SegmentsPerXfer cycle group. Once the first Advance pulse arrives, the LLFU <b>322</b> is synchronized to the MJI <b>320</b>. However, the LineSync pulse to start the next line must arrive at the MJI <b>320</b> at least 2SegmentsPerXfer cycles after the LLFU <b>322</b> so that the initial Transfer value is valid and the next 32-bit value is ready to be loaded into the Transfer register <b>342</b>.
P-0558[0558] The read process is shown in the following pseudocode: <tables id="TABLE-US-00043" num="43"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>DoneFirst = FALSE</entry></row><row><entry /><entry>For DotInSegment0 = 0 to 400</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>CurrAdr = DotInSegment0</entry></row><row><entry /><entry>XfersRemaining = 2 × SegmentGroups</entry></row><row><entry /><entry>DotCount = SegmentsPerXfer</entry></row><row><entry /><entry>Do</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>V1 = DotCount = 0</entry></row><row><entry /><entry>TransferWriteEnable = (V1 AND NOT DoneFirst)</entry></row><row><entry /><entry>OR ADVANCE</entry></row><row><entry /><entry>Stall = V1 AND (NOT TransferWriteEnable)</entry></row><row><entry /><entry>If (NOT Stall)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>Shift Register = Fetch 4-bits from</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>CurrReadBuffer:CurrAdr</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>CurrAdr = CurrAdr + 400</entry></row><row><entry /><entry>If (V1)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>DotCount = SegmentsPerXfer − 1</entry></row><row><entry /><entry>XfersRemaining = XfersRemaining − 1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>Else</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>DotCount = DotCount − 1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>EndIf</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>EndIf</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>Until (XfersRemaining = 0) AND (NOT Stall)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>EndFor</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0559[0559] The final transfer may not be fully utilized. This occurs when the number of segments per transfer does not divide evenly into the actual number of segments in the printhead. An example of this is the 8.5 inch printhead, which has 17 segments. Transferring 9 segments each time means that only 8 of the last 9 segments will be valid. Nonetheless, the timing requires the entire 9th segment value to be generated (even though it is not used). The actual address is therefore a don't care state since the data is not used.
P-0560[0560] Once the line has finished, the CurrReadBuffer value must be toggled by the processor.
P-0561[0561] 10.4.2.2 Writing
P-0562[0562] The write process is also straightforward. 4 DMA request lines are output to the DMA controller <b>200</b>. As requests are satisfied by the return DMA Acknowledge lines, the appropriate 8-bit destination address is selected (the lower 5 bits of the 15-bit output address are don't care values) and the acknowledge signal is passed to the correct buffer's WriteEnable control line (the Current Write Buffer is <img file="US20030197774A1-20031023-P00900.TIF" id="custom-character-00019" he="20" wi="20" img-format="tif" img-content="tx" />CurrentReadBuffer). The 10-bit destination address is selected from the 4 current addresses, one address per color. As DMA requests are satisfied the appropriate destination address is incremented, and the corresponding TransfersRemaining counter is decremented. The DMA request line is only set when the number of transfers remaining for that color is non-zero.
P-0563[0563] The following pseudocode illustrates the Write process: <tables id="TABLE-US-00044" num="44"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>CurrentAdr[1-4] = 0</entry></row><row><entry /><entry>While (ColorXfersRemaining[1-4] are non-zero)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>DMARequest[1-4] = ColorXfersRemaining[1-4] NOT = 0</entry></row><row><entry /><entry>If DMAAknowledge[N]</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>CurrWriteBuffer:CurrentAdr[N] =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>Fetch 32-bits from data bus</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>CurrentAdr[N] = CurrentAdr[N] + 1</entry></row><row><entry /><entry>ColorXfersRemaining [N] =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>ColorXfersRemaining[N] − 1 (floor 0)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>EndIf</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>EndWhile</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0564[0564] 10.4.3 Registers
P-0565[0565] The following interface registers are contained in the LLFU <b>322</b>: <tables id="TABLE-US-00045" num="45"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="287PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 40</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Line Load/Format Unit Registers</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="203PT" align="left" /><tbody valign="top"><row><entry>Register Name</entry><entry>Description</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>SegmentsPerXfer</entry><entry>The number of segments whose dots must be loaded before each</entry></row><row><entry /><entry>transfer. This has a maximum value of 9.</entry></row><row><entry>SegmentGroups</entry><entry>The number of segment groups in the printhead. This has a maximum</entry></row><row><entry /><entry>number of 4.</entry></row><row><entry>CurrentReadBuffer</entry><entry>The current buffer being read from. When Buffer0 is being read,</entry></row><row><entry /><entry>Buffer1 is written to and vice versa.</entry></row><row><entry /><entry>Should be toggled with each AdvanceLine pulse from the MJI.</entry></row><row><entry>Go</entry><entry>Bits 0 and 1 control the starting of the read and write processes</entry></row><row><entry /><entry>respectively.</entry></row><row><entry /><entry>A non-zero write to the appropriate bit starts the process.</entry></row><row><entry>Stop</entry><entry>Bits 0 and 1 control the stopping of the read and write processes</entry></row><row><entry /><entry>respectively.</entry></row><row><entry /><entry>A non-zero write to the appropriate bit stops the process.</entry></row><row><entry>Stall</entry><entry>This read-only status bit comes from the LLFU's Stall flag. The Stall</entry></row><row><entry /><entry>bit is valid when the write Go bit is set.</entry></row><row><entry /><entry>A Stall value of 1 means that the LLFU is waiting for the ADVANCE</entry></row><row><entry /><entry>pulse from the MJI to continue. The processor can safely start the</entry></row><row><entry /><entry>LSGU for the first line once the Stall bit is set.</entry></row><row><entry>ColorXfersRemaining[1-4]</entry><entry>The number of 32-bit transfers remaining to be read into the specific</entry></row><row><entry /><entry>Color[N] buffer.</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0566[0566] 10.5 Controlling a Print
P-0567[0567] When controlling a print the processor <b>181</b> programs and starts the LLFU <b>322</b> in read mode to ensure that the first line of the page is transferred to the buffer. When the interrupts arrive from the DMA controller <b>200</b>, the processor <b>181</b> can switch LLFU buffers <b>330</b>, <b>332</b>, and program the MJI <b>320</b>. The processor <b>181</b> then starts the LLFU <b>322</b> in read/write mode and starts the MJI <b>320</b>. The processor <b>181</b> should then wait a sufficient period of time to ensure that other connected printer controllers have also started their LLFUs and MJIs (if there are no other connected printer controllers, the processor <b>181</b> must wait until the Stall bit of the LLFU <b>322</b> is set, a duration of 2 SegmentsPerXfer cycles). The processor <b>181</b> can then program the LGSU <b>316</b>, <b>318</b> to start the synchronized print. As interrupts arrive from the DMA controllers <b>200</b>, the processor <b>181</b> can reprogram the DMA channels, swap LLFU buffers <b>330</b>, <b>332</b>, and restart the LLFU <b>322</b> in read/write mode. Once the LLFU <b>332</b> has effectively filled its pipeline, it will stall until the next Advance pulse from the MJI <b>320</b>. The MJI <b>320</b> does not have to be touched during the print.
P-0568[0568] If for some reason the processor <b>181</b> wants to make any changes to the MJI <b>320</b> or LLFU <b>322</b> registers during an inter-line period it should ensure that the current line has finished printing/loading by polling the status bits of the MJI <b>320</b> and the Go bits of the LLFU <b>322</b>.
P-0569[0569] 11 Generic Printer Driver
P-0570[0570] This section describes generic aspects of any host-based printer driver for CePrint <b>10</b>.
P-0571[0571] 11.1 Graphics and Imaging Model
P-0572[0572] We assume that the printer driver is closely coupled with the host graphics system, so that the printer driver can provide device-specific handling for different graphics and imaging operations, in particular compositing operations and text operations. We assume that the host provides support for color management, so that device-independent color can be converted to CePrint-specific CMYK color in a standard way, based on a user-selected CePrint-specific ICC (International Color Consortium) color profile. The color profile is normally selected implicitly by the user when the user specifies the output medium in the printer (i.e. plain paper, coated paper, transparency, etc.). The page description sent to the printer <b>10</b> always contains device-specific CMYK color.
P-0573[0573] We assume that the host graphics system renders images and graphics to a nominal resolution specified by the printer driver, but that it allows the printer driver to take control of rendering text. In particular, the graphics system provides sufficient information to the printer driver to allow it to render and position text at a higher resolution than the nominal device resolution.
P-0574[0574] We assume that the host graphics system requires random access to a contone page buffer at the nominal device resolution, into which it composites graphics and imaging objects, but that it allows the printer driver to take control of the actual compositing—i.e. it expects the printer driver to manage the page buffer.
P-0575[0575] 11.2 Two-Layer Page Buffer
P-0576[0576] The printer's page description contains a 267 ppi contone layer and an 800 dpi black layer. The black layer is conceptually above the contone layer, i.e. the black layer is composited over the contone layer by the printer. The printer driver therefore maintains a page buffer which correspondingly contains a medium-resolution contone layer and a high-resolution black layer.
P-0577[0577] The graphics systems renders and composites objects into the page buffer bottom-up—i.e. later objects obscure earlier objects. This works naturally when there is only a single layer, but not when there are two layers which will be composited later. It is therefore necessary to detect when an object being placed on the contone layer obscures something on the black layer.
P-0578[0578] When obscuration is detected, the obscured black pixels are composited with the contone layer and removed from the black layer. The obscuring object is then laid down on the contone layer, possibly interacting with the black pixels in some way. If the compositing mode of the obscuring object is such that no interaction with the background is possible, then the black pixels can simply be discarded without being composited with the contone layer. In practice, of course, there is little interaction between the contone layer and the black layer.
P-0579[0579] The printer driver specifies a nominal page resolution of 267 ppi to the graphics system. Where possible the printer driver relies on the graphics system to render image and graphics objects to the pixel level at 267 ppi, with the exception of black text. The printer driver fields all text rendering requests, detects and renders black text at 800 dpi, but returns non-black text rendering requests to the graphics system for rendering at 267 ppi.
P-0580[0580] Ideally the graphics system and the printer driver manipulate color in device-independent RGB, deferring conversion to device-specific CMYK until the page is complete and ready to be sent to the printer. This reduces page buffer requirements and makes compositing more rational. Compositing in CMYK color space is not ideal.
P-0581[0581] Ultimately the graphics system asks the printer driver to composite each rendered object into the printer driver's page buffer. Each such object uses 24-bit contone RGB, and has an explicit (or implicitly opaque) opacity channel.
P-0582[0582] The printer driver maintains the two-layer page buffer in three parts. The first part is the medium-resolution (267 ppi) contone layer. This consists of a 24-bit RGB bitmap. The second part is a medium-resolution black layer. This consists of an 8-bit opacity bitmap. The third part is a high-resolution (800 dpi) black layer. This consists of a 1-bit opacity bitmap. The medium-resolution black layer is a subsampled version of the high-resolution opacity layer. In practice, assuming the low resolution is an integer factor n of the high resolution (e.g. n=800/267=3), each low-resolution opacity value is obtained by averaging the corresponding n×n high-resolution opacity values. This corresponds to box-filtered subsampling. The subsampling of the black pixels effectively antialiases edges in the high-resolution black layer, thereby reducing ringing artifacts when the contone layer is subsequently JPEG-compressed and decompressed.
P-0583[0583] The structure and size of the page buffer is illustrated in FIG. 47.
P-0584[0584] 11.3 Compositing Model
P-0585[0585] For the purposes of discussing the page buffer compositing model, we define the following variables. <tables id="TABLE-US-00046" num="46"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="259PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 41</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Compositing variables</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="1" colwidth="28PT" align="left" /><colspec colname="2" colwidth="126PT" align="left" /><colspec colname="3" colwidth="35PT" align="left" /><colspec colname="4" colwidth="70PT" align="left" /><tbody valign="top"><row><entry>variable</entry><entry>description</entry><entry>resolution</entry><entry>format</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row><row><entry>n</entry><entry>medium to high resolution scale factor</entry><entry>—</entry><entry>—</entry></row><row><entry>C<sub>BgM</sub></entry><entry>background contone layer color</entry><entry>medium</entry><entry>8-bit color component</entry></row><row><entry>C<sub>ObM</sub></entry><entry>contone object color</entry><entry>medium</entry><entry>8-bit color component</entry></row><row><entry>α<sub>ObM</sub></entry><entry>contone object opacity</entry><entry>medium</entry><entry>8-bit opacity</entry></row><row><entry>α<sub>FgM</sub></entry><entry>medium-resolution foreground black layer</entry><entry>medium</entry><entry>8-bit opacity</entry></row><row><entry /><entry>opacity</entry></row><row><entry>α<sub>FgH</sub></entry><entry>foreground black layer opacity</entry><entry>high</entry><entry>1-bit opacity</entry></row><row><entry>α<sub>TxH</sub></entry><entry>black object opacity</entry><entry>high</entry><entry>1-bit opacity</entry></row><row><entry namest="1" nameend="4" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0586[0586] When a black object of opacity α<sub>TxH </sub>is composited with the black layer, the black layer is updated as follows:
α<sub>FgH</sub><i>[x, y]←α</i><sub>FgH</sub><i>[x, y]<img file="US20030197774A1-20031023-P00901.TIF" id="custom-character-00020" he="20" wi="20" img-format="tif" img-content="tx" />α</i><sub>TxH</sub><i>[x, y]</i> (Rule 1)
P-0587[0587]<maths id="MATH-US-00001" num="1"><math overflow="scroll"><mtable><mtr><mtd><mrow><mrow><msub><mi>α</mi><mi>FgM</mi></msub><mo></mo><mrow><mo>[</mo><mrow><mi>x</mi><mo>,</mo><mi>y</mi></mrow><mo>]</mo></mrow></mrow><mo>←</mo><mrow><mfrac><mn>1</mn><msup><mi>n</mi><mn>2</mn></msup></mfrac><mo></mo><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>-</mo><mn>1</mn></mrow></munderover><mo></mo><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>-</mo><mn>1</mn></mrow></munderover><mo></mo><mrow><mn>255</mn><mo></mo><mrow><msub><mi>α</mi><mi>FgH</mi></msub><mo></mo><mrow><mo>[</mo><mrow><mrow><mrow><mi>n</mi><mo></mo><mstyle><mtext> </mtext></mstyle><mo></mo><mi>x</mi></mrow><mo>+</mo><mi>i</mi></mrow><mo>,</mo><mrow><mrow><mi>n</mi><mo></mo><mstyle><mtext> </mtext></mstyle><mo></mo><mi>y</mi></mrow><mo>+</mo><mi>j</mi></mrow></mrow><mo>]</mo></mrow></mrow></mrow></mrow></mrow></mrow></mrow></mtd><mtd><mstyle><mtext>(Rule 2)</mtext></mstyle></mtd></mtr></mtable></math><img file="US20030197774A1-20031023-M00001.TIF" id="EMI-M00001" he="25.9119" wi="216.027" img-format="tif" img-content="mf" /><attachments><attachment idref="MATHEMATICA-00001" attachment-type="nb" file="US20030197774A1-20031023-M00001.NB" /></attachments></maths>
P-0588[0588] The object opacity is simply ored with the black layer opacity (Rule 1), and the corresponding part of the medium-resolution black layer is re-computed from the high-resolution black layer (Rule 2).
P-0589[0589] When a contone object of color C<sub>ObM </sub>and opacity α<sub>ObM </sub>is composited with the contone layer, the contone layer and the black layer are updated as follows:
<i>C</i><sub>BgM</sub><i>[x, y]←C</i><sub>BgM</sub><i>[x, y]</i>(1−α<sub>FgM</sub><i>[x, y]</i>) if α<sub>ObM</sub><i>[x, y]></i>0 (Rule 3)
α<sub>FgM</sub><i>[x, y]←</i>0 if α<sub>ObM</sub><i>[x, y]></i>0 (Rule 4)
α<sub>FgH</sub><i>[x, y]←</i>0 if α<sub>ObM</sub><i>[x/n, y/n]></i>0 (Rule 5)
<i>C</i><sub>BgM</sub><i>[x, y]←C</i><sub>BgM</sub><i>[x, y]</i>(1−α<sub>ObM</sub><i>[x, y]</i>)+<i>C</i><sub>ObM</sub><i>[x, y]α</i><sub>ObM</sub><i>[x, y]</i> (Rule 6)
P-0590[0590] Wherever the contone object obscures the black layer, even if not fully opaquely, the affected black layer pixels are pushed from the black layer to the contone layer, i.e. composited with the contone layer (Rule 3) and removed from the black layer (Rule 4 and Rule 5). The contone object is then composited with the contone layer (Rule 6).
P-0591[0591] If a contone object pixel is fully opaque (i.e.α<sub>ObM</sub>[x, y]=255), then there is no need to push the corresponding black pixels into the background contone layer (Rule 3), since the background contone pixel will subsequently be completely obliterated by the foreground contone pixel (Rule 6).
P-0592[0592] 11.4 Page Compression and Delivery
P-0593[0593] Once page rendering is complete, the printer driver converts the contone layer to CePrint-specific CMYK with the help of color management functions provided by the graphics system.
P-0594[0594] The printer driver then compresses and packages the black layer and the contone layer into a CePrint page description as described in Section 6.2. This page description is delivered to the printer <b>10</b> via the standard spooler.
P-0595[0595] Note that the black layer is manipulated as a set of 1-bit opacity values, but is delivered to the printer <b>10</b> as a set of 1-bit black values. Although these two interpretations are different, they share the same representation, and so no data conversion is required.
P-0596[0596] The forward discrete cosine transform (DCT) is the costliest part of JPEG compression. In current high-quality software implementations, the forward DCT of each 8×8 block requires 12 integer multiplications and 32 integer additions. On typical modem general-purpose processors, an integer multiplication requires 10 cycles, and an integer addition requires 2 cycles. This equates to a total cost per block of 184 cycles.
P-0597[0597] The 26.4 MB contone layer consists of 432,538 JPEG blocks, giving an overall forward DCT cost of about 80 Mcycles. At 150 MHz this equates to about 0.5 seconds, which is 25% of the 2 second rendering time allowed per page.
P-0598[0598] A CE-oriented processor may have DSP support, in which case the presence of single-cycle multiplication makes the JPEG compression time negligible.
P-0599[0599] 11.5 Banded Output
P-0600[0600] The printer control protocol supports the transmission of the page to the printer <b>10</b> as a series of bands. If the graphics system also supports banded output, then this allows the printer driver to reduce its memory requirements by rendering the image one band at a time. Note, however, that rendering one band at a time can be more expensive than rendering the whole page at once, since objects which span multiple bands have to be handled multiple times.
P-0601[0601] Although banded rendering can be used to reduce memory requirements in the printer driver, buffers for two bands are still required. One buffer is required for the band being transmitted to the printer <b>10</b>; another buffer is required for the band being rendered. A single buffer may suffice if the connection between the host processor and printer is sufficiently fast. The band being transmitted to the printer may also be stored on disk, if a disk drive is present in the system, and only loaded into memory block-by-block during transmission.
P-0602[0602] 12 Windows 9X/NT/CE Printer Driver
P-0603[0603] 12.1 Windows 9x/NT/CE Printing System
P-0604[0604] In the Windows 9x/NT/CE printing system, a printer is a graphics device, and an application communicates with it via the graphics device interface (GDI). The printer driver graphics DLL (dynamic link library) implements the device-dependent aspects of the various graphics functions provided by GDI.
P-0605[0605] The spooler handles the delivery of pages to the printer, and may reside on a different machine to the application requesting printing. It delivers pages to the printer via a port monitor which handles the physical connection to the printer. The optional language monitor is the part of the printer driver which imposes additional protocol on communication with the printer, and in particular decodes status responses from the printer on behalf of the spooler.
P-0606[0606] The printer driver user interface DLL implements the user interface for editing printer-specific properties and reporting printer-specific events.
P-0607[0607] The structure of the Windows 9x/NT/CE printing system is illustrated in FIG. 48.
P-0608[0608] The printer driver language monitor and user interface DLL must implement the implement the relevant aspects of the printer control protocol described in Section 6. The remainder of this section describes the design of the printer driver graphics DLL. It should be read in conjunction with the appropriate Windows 9x/NT/CE DDK documentation.
P-0609[0609] 12.2 Windows 9x/NT/CE Graphics Device Interface (GDI)
P-0610[0610] GDI provides functions which allow an application to draw on a device surface, i.e. typically an abstraction of a display screen or a printed page. For a raster device, the device surface is conceptually a color bitmap. The application can draw on the surface in a device-independent way, i.e. independently of the resolution and color characteristics of the device.
P-0611[0611] The application has random access to the entire device surface. This means that if a memory-limited printer device requires banded output, then GDI must buffer the entire page's GDI commands and replay them windowed into each band in turn. Although this provides the application with great flexibility, it can adversely affect performance. GDI supports color management, whereby device-independent colors provided by the application are transparently translated into device-dependent colors according to a standard ICC (International Color Consortium) color profile of the device. A printer driver can activate a different color profile depending, for example, on the user's selection of paper type on the driver-managed printer property sheet.
P-0612[0612] GDI supports line and spline outline graphics (paths), images, and text. Outline graphics, including outline font glyphs, can be stroked and filled with bit-mapped brush patterns. Graphics and images can be geometrically transformed and composited with the contents of the device surface. While Windows 95/NT4 provides only boolean compositing operators, Windows 98/NT5 provides proper alpha-blending.
P-0613[0613] 12.3 Printer Driver Graphics DLL
P-0614[0614] A raster printer can, in theory, utilize standard printer driver components under Windows 9x/NT/CE, and this can make the job of developing a printer driver trivial. This relies on being able to model the device surface as a single bitmap. The problem with this is that text and images must be rendered at the same resolution. This either compromises text resolution, or generates too much output data, compromising performance. As described earlier, CePrint's approach is to render black text and images at different resolutions, to optimize the reproduction of each. The printer driver is therefore implemented according to the generic design described in Section 11.
P-0615[0615] The driver therefore maintains a two-layer three-part page buffer as described in Section 11.2, and this means that the printer driver must take over managing the device surface, which in turn means that it must mediate all GDI access to the device surface.
P-0616[0616] 12.3.1 Managing the Device Surface
P-0617[0617] A graphics driver must support a number of standard functions, including the following: <tables id="TABLE-US-00047" num="47"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 42</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Standard graphics driver interface functions</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="56PT" align="left" /><colspec colname="2" colwidth="161PT" align="left" /><tbody valign="top"><row><entry>function</entry><entry>description</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>DrvEnableDriver</entry><entry>Initial entry point into the driver graphics DLL.</entry></row><row><entry /><entry>Returns addresses of functions supported by the driver.</entry></row><row><entry>DrvEnablePDEV</entry><entry>Creates a logical representation of a physical device</entry></row><row><entry /><entry>with which the driver can associate a drawing surface.</entry></row><row><entry>DrvEnableSurface</entry><entry>Creates a surface to be drawn on, associated with a</entry></row><row><entry /><entry>given PDEV.</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0618[0618] DrvEnablePDEV indicates to GDI, via the f1GraphicsCaps member of the returned DEVINFO structure, the graphics rendering capabilities of the driver. This is discussed further below.
P-0619[0619] DrvEnableSurface creates a device surface consisting of two conceptual layers and three parts: the 267 ppi contone layer 24-bit RGB color, the 267 ppi black layer 8-bit opacity, and the 800 dpi black layer 1-bit opacity. The virtual device surface which encapsulates these two layers has a nominal resolution of 267 ppi, so this is the resolution at which GDI operations take place.
P-0620[0620] Although the aggregate page buffer requires about 34 MB of memory, the size of the page buffer can be reduced arbitrarily by rendering the page one band at a time, as described in Section 12.3.4.
P-0621[0621] A printer-specific graphics driver must also support the following functions: <tables id="TABLE-US-00048" num="48"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 43</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Required printer driver functions</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="56PT" align="left" /><colspec colname="2" colwidth="161PT" align="left" /><tbody valign="top"><row><entry>function</entry><entry>description</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>DrvStartDoc</entry><entry>Performs any start-of-document handling</entry></row><row><entry>DrvStartPage</entry><entry>Handles the start of a new page.</entry></row><row><entry>DrvSendPage</entry><entry>Sends the current page to the printer via the spooler.</entry></row><row><entry>DrvEndDoc</entry><entry>Performs any end-of-document handling.</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0622[0622] DrvStartDoc sends the start document command to the printer, and DrvEndDoc sends the end document command.
P-0623[0623] DrvStartPage sends the start page command with the page header to the printer.
P-0624[0624] DrvSendPage converts the contone layer from RGB to CMYK using GDI-provided color management functions, compresses both the contone and black layers, and sends the compressed page as a single band to the printer (in a page band command).
P-0625[0625] Both DrvStartPage and DrvSendPage use EngWritePrinter to send data to the printer via the spooler.
P-0626[0626] Managing the device surface and mediating GDI access to it means that the printer driver must support the following additional functions: <tables id="TABLE-US-00049" num="49"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 44</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Required graphics driver functions for a device-managed surface</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="56PT" align="left" /><colspec colname="2" colwidth="161PT" align="left" /><tbody valign="top"><row><entry>function</entry><entry>description</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>DrvCopyBits</entry><entry>Translates between device-managed raster surfaces</entry></row><row><entry /><entry>and GDI-managed standard-format bitmaps.</entry></row><row><entry>DrvStrokePath</entry><entry>Strokes a path.</entry></row><row><entry>DrvPaint</entry><entry>Paints a specified region.</entry></row><row><entry>DrvTextOut</entry><entry>Renders a set of glyphs at specified positions.</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0627[0627] Copying images, stroking paths and filling regions all occur on the contone layer, while rendering solid black text occurs on the bi-level black layer. Furthermore, rendering non-black text also occurs on the contone layer, since it isn't supported on the black layer. Conversely, stroking or filling with solid black can occur on the black layer (if we so choose).
P-0628[0628] Although the printer driver is obliged to hook the aforementioned functions, it can punt function calls which apply to the contone layer back to the corresponding GDI implementations of the functions, since the contone layer is a standard-format bitmap. For every DrvXxx function there is a corresponding EngXxx function provided by GDI.
P-0629[0629] As described in Section 11.2, when an object destined for the contone layer obscures pixels on the black layer, the obscured black pixels must be transferred from the black layer to the contone layer before the contone object is composited with the contone layer. The key to this process working is that obscuration is detected and handled in the hooked call, before it is punted back to GDI. This involves determining the pixel-by-pixel opacity of the contone object from its geometry, and using this opacity to selectively transfer black pixels from the black layer to the contone layer as described in Section 1 1.2.
P-0630[0630] 12.3.2 Determining Contone Object Geometry
P-0631[0631] It is possible to determine the geometry of each contone object before it is rendered and thus determine efficiently which black pixels it obscures. In the case of DrvCopyBits and DrvPaint, the geometry is determined by a clip object (CLIPOBJ), which can be enumerated as a set of rectangles.
P-0632[0632] In the case of DrvStrokePath, things are more complicated. DrvStrokePath supports both straight-line and Bézier-spline curve segments, and single-pixel-wide lines and geometric-wide lines. The first step is to avoid the complexity of Bézier-spline curve segments and geometric-wide lines altogether by clearing the corresponding capability flags (GCAPS_BEZIERS and GCAPS_GEOMETRICWIDE) in the f1GraphicsCaps member of the driver's DEVINFO structure. This causes GDI to reformulate such calls as sets of simpler calls to DrvPaint. In general, GDI gives a driver the opportunity to accelerate high-level capabilities, but simulates any capabilities not provided by the driver.
P-0633[0633] What remains is simply to determine the geometry of a single-pixel-wide straight line. Such a line can be solid or cosmetic. In the latter case, the line style is determined by a styling array in the specified line attributes (LINEATTRS). The styling array specifies how the line alternates between being opaque and transparent along its length, and so supports various dashed line effects etc.
P-0634[0634] When the brush is solid black, straight lines can also usefully be rendered to the black layer, though with the increased width implied by the 800 dpi resolution.
P-0635[0635] 12.3.3 Rendering Text
P-0636[0636] In the case of a DrvTextOut, things are also more complicated. Firstly, the opaque background, if any, is handled like any other fill on the contone layer (see DrvPaint). If the foreground brush is not black, or the mix mode is not effectively opaque, or the font is not scalable, or the font indicates outline stroking, then the call is punted to EngTextOut, to be applied to the contone layer. Before the call is punted, however, the driver determines the geometry of each glyph by obtaining its bitmap (via FONTOBJ_cGetGlyphs), and makes the usual obscuration check against the black layer.
P-0637[0637] If punting a DrvTextOut call is not allowed (the documentation is ambiguous), then the driver should disallow complex text operations. This includes disallowing outline stroking (by clearing the GCAPS_VECTOR_FONT capability flag), and disallowing complex mix modes (by clearing the GCAPS_ARBMIXTXT capability flag). If the foreground brush is black and opaque, and the font is scalable and not stroked, then the glyphs are rendered on the black layer. In this case the driver determines the geometry of each glyph by obtaining its outline (again via FONTOBJ_cGetGlyphs, but as a PATHOBJ). The driver then renders each glyph from its outline at 800 dpi and writes it to the black layer. Although the outline geometry uses device coordinates (i.e. at 267 ppi), the coordinates are in fixed point format with plenty of fractional precision for higher-resolution rendering.
P-0638[0638] Note that strikethrough and underline rectangles are added to the glyph geometry, if specified.
P-0639[0639] The driver must set the GCAPS_HIGHRESTEXT flag in the DEVINFO to request that glyph positions (again in 267 ppi device coordinates) be supplied by GDI in high-precision fixed-point format, to allow accurate positioning at 800 dpi. The driver must also provide an implementation of the DrvGetGlyphMode function, so that it can indicate to GDI that glyphs should be cached as outlines rather than bitmaps. Ideally the driver should cache rendered glyph bitmaps for efficiency, memory allowing. Only glyphs below a certain point size should be cached.
P-0640[0640] 12.3.4 Banded Output
P-0641[0641] As described in Section 6, the printer control protocol supports banded output by breaking the page description into a page header and a number of page bands. GDI supports banded output to a printer to cater for printer drivers and printers which have limited internal buffer memory.
P-0642[0642] GDI can handle banded output without application involvement. GDI simply records all the graphics operations performed by the application in a metafile, and then replays the entire metafile to the printer driver for each band in the page. The printer driver must clip the graphics operations to the current band, as usual. Banded output can be more efficient if the application takes note of the RC_BANDING bit in the driver's raster capabilities (returned by GetDeviceCaps when called with the RASTERCAPS index) and only performs graphics operations relevant to each band.
P-0643[0643] If banded output is desired because memory is limited, then the printer driver must enable banding by calling EngMarkBandingSurface in DrvEnableSurface. It must also support the following additional functions: <tables id="TABLE-US-00050" num="50"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="center" /><thead><row><entry namest="1" nameend="1" align="center">TABLE 45</entry></row></thead><tbody valign="top"><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Required printer driver functions</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="1" colwidth="56PT" align="left" /><colspec colname="2" colwidth="161PT" align="left" /><tbody valign="top"><row><entry>function</entry><entry>description</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row><row><entry>DrvStartBanding</entry><entry>Prepares the driver for banding and returns the origin</entry></row><row><entry /><entry>of the first band.</entry></row><row><entry>DrvNextBand</entry><entry>Sends the current band to the printer and returns the</entry></row><row><entry /><entry>origin of the next band, if any.</entry></row><row><entry namest="1" nameend="2" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
P-0644[0644] Like DrvSendPage, DrvNextBand converts the contone layer from RGB to CMYK using GDI-provided color management functions, compresses both the contone and black layers, and sends the compressed page band to the printer (in a page band command).
P-0645[0645] It uses EngWritePrinter to send the band data to the printer via the spooler.
Contents4
44 sheets
Sheet 1 Sheet 2 Sheet 3 Sheet 4 Sheet 5 Sheet 6 Sheet 7 Sheet 8 Sheet 9 Sheet 10 Sheet 11 Sheet 12 Sheet 13 Sheet 14 Sheet 15 Sheet 16 Sheet 17 Sheet 18 Sheet 19 Sheet 20 Sheet 21 Sheet 22 Sheet 23 Sheet 24 Sheet 25 Sheet 26 Sheet 27 Sheet 28 Sheet 29 Sheet 30 Sheet 31 Sheet 32 Sheet 33 Sheet 34 Sheet 35 Sheet 36 Sheet 37 Sheet 38 Sheet 39 Sheet 40 Sheet 41 Sheet 42 Sheet 43 Sheet 44
Every citation, both ways
| Document | Relation | Office | Cited during |
|---|---|---|---|
| US7997673B2 | Cited by | United States of America | Applicant |
| US8388109B2 | Cited by | United States of America | Applicant |
| US2010149239A1 | Cited by | United States of America | Pre-grant |
| US8075099B2 | Cited by | United States of America | Applicant |
| US2005073712A1 | Cited by | United States of America | Pre-grant |
| US2008285062A1 | Cited by | United States of America | Pre-grant |
| US2007188776A1 | Cited by | United States of America | Pre-grant |
| US2008084445A1 | Cited by | United States of America | Pre-grant |
| US7876475B2 | Cited by | United States of America | Applicant |
| US7946674B2 | Cited by | United States of America | Search report |
| US7365874B2 | Cited by | United States of America | Applicant |
| US2004027616A1 | Cited by | United States of America | Pre-grant |
| US7072076B2 | Cited by | United States of America | Search report |
| US8287077B2 | Cited by | United States of America | Applicant |
| US2010073696A1 | Cited by | United States of America | Pre-grant |
| US7251051B2 | Cited by | United States of America | Applicant |
| US2010220136A1 | Cited by | United States of America | Pre-grant |
| US2008084453A1 | Cited by | United States of America | Pre-grant |
| US7433073B2 | Cited by | United States of America | Applicant |
| US2010020120A1 | Cited by | United States of America | Pre-grant |
| US7092125B2 | Cited by | United States of America | Search report |
| US2008084454A1 | Cited by | United States of America | Pre-grant |
| US7944586B2 | Cited by | United States of America | Applicant |
| US2008084583A1 | Cited by | United States of America | Pre-grant |
| US7164501B2 | Cited by | United States of America | Search report |
| US7215443B2 | Cited by | United States of America | Search report |
| US7400419B2 | Cited by | United States of America | Applicant |
| US7268911B2 | Cited by | United States of America | Applicant |
| US2010149243A1 | Cited by | United States of America | Pre-grant |
| US8016389B2 | Cited by | United States of America | Applicant |
| US2006109287A1 | Cited by | United States of America | Pre-grant |
| US2004036919A1 | Cited by | United States of America | Pre-grant |
| US7936478B2 | Cited by | United States of America | Applicant |
| US2008158608A1 | Cited by | United States of America | Pre-grant |
| US7847972B2 | Cited by | United States of America | Applicant |
| US2005219572A1 | Cited by | United States of America | Pre-grant |
| US2010188458A1 | Cited by | United States of America | Pre-grant |
| US7639397B2 | Cited by | United States of America | Search report |
146 members in 12 offices
Priority claims5
| Document | Office | Kind | Date |
|---|---|---|---|
| PP773798 | Australia | A | |
| PP773898 | Australia | A | |
| PP996299 | Australia | A | |
| 45878599 | United States of America | A | |
| 17162702 | United States of America | A |
Members146
| Document | Office | Kind | |
|---|---|---|---|
| CA2355188A1 | Canada | A1 | |
| CA2598265A1 | Canada | A1 | |
| WO0035675A1 | World Intellectual Property Organization (WIPO) | A1 | |
| AU1536400A | Australia | A | |
| EP1150844A1 | European Patent Office (EPO) | A1 | |
| KR20010108022A | Republic of Korea | A | |
| US6334664B1 | United States of America | B1 | |
| CN1330591A | China | A | |
| US6398359B1 | United States of America | B1 | |
| US6431777B1 | United States of America | B1 | |
| US6447113B1 | United States of America | B1 | |
| HK1043344A1 | Hong Kong, China | A1 | |
| JP2002532287A | Japan | A | |
| EP1150844A4 | European Patent Office (EPO) | A4 | |
| US2003085975A1 | United States of America | A1 | |
| US2003103124A1 | United States of America | A1 | |
| US2003189615A1 | United States of America | A1 | |
| US6631986B2 | United States of America | B2 | |
| US2003197774A1 | United States of America | A1 | |
| AU2003248305A1 | Australia | A1 | |
| AU2003248306A1 | Australia | A1 | |
| AU2003248307A1 | Australia | A1 | |
| AU2003248309A1 | Australia | A1 | |
| AU2003248310A1 | Australia | A1 | |
| US6652089B2 | United States of America | B2 | |
| US6652090B2 | United States of America | B2 | |
| US2004046971A1 | United States of America | A1 | |
| AU771998B2 | Australia | B2 | |
| CN1146498C | China | C | |
| US2004085428A1 | United States of America | A1 | |
| US2004090509A1 | United States of America | A1 | |
| US2004090511A1 | United States of America | A1 | |
| AU2003248309B2 | Australia | B2 | |
| AU2003248307B2 | Australia | B2 | |
| US6820974B2 | United States of America | B2 | |
| US2004233266A1 | United States of America | A1 | |
| CN1550328A | China | A | |
| KR20040104744A | Republic of Korea | A | |
| KR20040104745A | Republic of Korea | A | |
| KR20040104746A | Republic of Korea | A | |
| KR20040104747A | Republic of Korea | A | |
| KR20040104748A | Republic of Korea | A | |
| AU2004233541A1 | Australia | A1 | |
| AU2004233545A1 | Australia | A1 | |
| US2005046685A1 | United States of America | A1 | |
| EP1520697A2 | European Patent Office (EPO) | A2 | |
| EP1520698A2 | European Patent Office (EPO) | A2 | |
| EP1520699A2 | European Patent Office (EPO) | A2 | |
| EP1520700A2 | European Patent Office (EPO) | A2 | |
| US2005078161A1 | United States of America | A1 | |
| EP1520697A3 | European Patent Office (EPO) | A3 | |
| EP1520699A3 | European Patent Office (EPO) | A3 | |
| US2005083389A1 | United States of America | A1 | |
| EP1520698A3 | European Patent Office (EPO) | A3 | |
| EP1520700A3 | European Patent Office (EPO) | A3 | |
| AU2003248306B2 | Australia | B2 | |
| AU2003248310B2 | Australia | B2 | |
| AU2003248305B2 | Australia | B2 | |
| US6899420B2 | United States of America | B2 | |
| EP1535738A1 | European Patent Office (EPO) | A1 | |
| US2005151779A1 | United States of America | A1 | |
| US6918665B2 | United States of America | B2 | |
| AU2005202930A1 | Australia | A1 | |
| AU2005203473A1 | Australia | A1 | |
| US6935736B2 | United States of America | B2 | |
| US2005206712A1 | United States of America | A1 | |
| SG116487A1 | Singapore | A1 | |
| SG116488A1 | Singapore | A1 | |
| US2006055758A1 | United States of America | A1 | |
| EP1150844B1 | European Patent Office (EPO) | B1 | |
| KR100576690B1 | Republic of Korea | B1 | |
| KR100576620B1 | Republic of Korea | B1 | |
| KR100576628B1 | Republic of Korea | B1 | |
| KR100576655B1 | Republic of Korea | B1 | |
| KR100576676B1 | Republic of Korea | B1 | |
| KR100577076B1 | Republic of Korea | B1 | |
| US2006098034A1 | United States of America | A1 | |
| US7055947B2 | United States of America | B2 | |
| US7057759B2 | United States of America | B2 | |
| DE69931192D1 | Germany | D1 | |
| US2006119687A1 | United States of America | A1 | |
| AT324981T | Austria | T | |
| ATE324981T1 | Austria | T1 | |
| EP1535738B1 | European Patent Office (EPO) | B1 | |
| US7086728B2 | United States of America | B2 | |
| EP1520698B1 | European Patent Office (EPO) | B1 | |
| EP1520700B1 | European Patent Office (EPO) | B1 | |
| AT334827T | Austria | T | |
| ATE334827T1 | Austria | T1 | |
| AU2004233545B2 | Australia | B2 | |
| EP1520697B1 | European Patent Office (EPO) | B1 | |
| EP1520699B1 | European Patent Office (EPO) | B1 | |
| CN1827371A | China | A | |
| DE69932652D1 | Germany | D1 | |
| AT335610T | Austria | T | |
| AT335611T | Austria | T | |
| AT337913T | Austria | T | |
| AT337914T | Austria | T | |
| ATE335610T1 | Austria | T1 | |
| ATE335611T1 | Austria | T1 |
36 transactions on the USPTO file
Allowed after 1 non-final rejection.
- Non-final rejections
- 1
- Final rejections
- 0
- RCEs
- 0
- Appeals
- 0
Over time
Point at a mark for the transactionTransactions
| Event | Code | |
|---|---|---|
| Expire PatentEXP. | EXP. | |
| Correspondence Address ChangeC.ADB | C.ADB | |
| Change in Power of Attorney (May Include Associate POA)PA.. | PA.. | |
| Correspondence Address ChangeC.AD | C.AD | |
| Recordation of Patent Grant MailedPGM/ | PGM/ | |
| Patent Issue Date Used in PTA CalculationAllowedPTAC | PTAC | |
| Issue Notification MailedAllowedWPIR | WPIR | |
| Receipt into PubsR1021 | R1021 | |
| Application Is Considered Ready for IssuePILS | PILS | |
| Receipt into PubsR1021 | R1021 | |
| Issue Fee Payment VerifiedN084 | N084 | |
| Issue Fee Payment ReceivedIFEE | IFEE | |
| Receipt into PubsR1021 | R1021 | |
| Workflow - File Sent to ContractorSENT | SENT | |
| Receipt into PubsR1021 | R1021 | |
| Dispatch to PublicationsD1220 | D1220 | |
| Mail Notice of AllowanceAllowedMN/=. | MN/=. | |
| Mail Notification of Terminal Disclaimer - AcceptedMN574 | MN574 | |
| Notice of Allowance Data Verification CompletedAllowedN/=. | N/=. | |
| Notification of Terminal Disclaimer - AcceptedN574 | N574 | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Terminal Disclaimer Filed | – | |
| Terminal Disclaimer Filed | – | |
| Response after Non-Final ActionA... | A... | |
| Request for Extension of Time - GrantedXT/G | XT/G | |
| Entity status set to undiscounted (initial default setting or status change) | – | |
| Entity Status Set To Undiscounted (Initial Default Setting or Status Change)BIG. | BIG. | |
| Mail Non-Final RejectionNon-final rejectionMCTNF | MCTNF | |
| Non-Final RejectionNon-final rejectionCTNF | CTNF | |
| Case Docketed to Examiner in GAUDOCK | DOCK | |
| Application Dispatched from OIPEOIPE | OIPE | |
| Application Is Now CompleteCOMP | COMP | |
| IFW Scan & PACR Auto Security Review | – | |
| Workflow - Drawings FinishedDRWF | DRWF | |
| Workflow - Drawings Matched with File at ContractorDRWM | DRWM | |
| Initial Exam Team nnIEXX | IEXX |
10 legal events, as the office reported them to INPADOC
Over the term
Point at a mark for the eventEvents
| Event | Code | |
|---|---|---|
| Lapsed due to failure to pay maintenance feeLapsedFP | FP | |
| Information on status: patent discontinuationPATENT EXPIRED DUE TO NONPAYMENT OF MAINTENANCE FEES UNDER 37 CFR 1.362STCH | STCH | |
| Information on status: patent discontinuationPATENT EXPIRED DUE TO NONPAYMENT OF MAINTENANCE FEES UNDER 37 CFR 1.362STCH | STCH | |
| Lapse for failure to pay maintenance feesLapsedLAPS | LAPS | |
| Maintenance fee reminder mailedREMI | REMI | |
| AssignmentAS | AS | |
| AssignmentAS | AS | |
| Fee paymentFPAY | FPAY | |
| Fee paymentFPAY | FPAY | |
| AssignmentAS | AS |
Numbers
- Application
- 30924102
Titles
- English
- Recess mountable printing system
Patent term adjustment
- Applicant delay
- −18 days
- Net adjustment
- 0 days
Classification
- CPC, 12
- B41J2/155
- B41J2/01
- B41J2/16508
- B41J3/445
- B41J29/023
- B41J29/17
- B41J29/38
- G06K15/16
- B41J2/0057
- B41J13/10
- B41J2/165
- B41J3/00
- IPC, 14
- B41J2 00
- B41J2 155
- B41J2 165
- B41J3 42
- B41J3 44
- B41J3 60
- B41J11 00
- B41J11 42
- B41J13 076
- B41J13 10
- B41J29 02
- B41J29 17
- B41J29 38
- G06K15 16