Patent Publication Number: US-7901037-B2

Title: Print engine having printhead control modes

Description:
CROSS REFERENCE TO RELATED APPLICATION 
     This application is a continuation of U.S. application Ser. No. 10/854,493, now U.S. Pat. No. 7,517,036, filed May 27, 2004 all of which are herein incorporated by reference. 
    
    
     FIELD OF THE INVENTION 
     The present invention relates to a printhead having printhead module for use in a printer. The invention has primarily been developed for use in a pagewidth inkjet printer, comprising a printhead that includes one or more of the printhead modules, and will be described with reference to this example. However, it will be appreciated that the invention is not limited to any particular type of printing technology, and is not limited to use in, for example, pagewidth and inkjet printing. 
     CO-PENDING APPLICATIONS 
     
       
         
           
               
               
               
               
               
             
               
                   
               
             
            
               
                 7,374,266 
                 7,427,117 
                 10/854,488 
                 7,281,330 
                 10/854,503 
               
               
                 7,328,956 
                 10/854,509 
                 7,188,928 
                 7,093,989 
                 7,377,609 
               
               
                 10/854,495 
                 10/854,498 
                 10/854,511 
                 7,390,071 
                 10/854,525 
               
               
                 10/854,526 
                 10/854,516 
                 7,252,353 
                 10/854,515 
                 7,267,417 
               
               
                 10/854,505 
                 10/854,493 
                 7,275,805 
                 7,314,261 
                 10/854,490 
               
               
                 7,281,777 
                 10/854,528 
                 10/854,523 
                 10/854,527 
                 10/854,524 
               
               
                 10/854,520 
                 10/854,514 
                 10/854,519 
                 10/854,513 
                 10/854,499 
               
               
                 10/854,501 
                 7,266,661 
                 7,243,193 
                 10/854,518 
                 10/854,517 
               
               
                   
               
            
           
         
       
     
     The disclosures of these co-pending applications are incorporated herein by cross-reference. Various methods, systems and apparatus relating to the present invention are disclosed in the following co-pending applications filed by the applicant or assignee of the present invention. The disclosures of all of these co-pending applications are incorporated herein by cross-reference. 
     
       
         
           
               
               
               
               
               
             
               
                   
               
             
            
               
                 7,249,108 
                 6,566,858 
                 6,331,946 
                 6,246,970 
                 6,442,525 
               
               
                 7,346,586 
                 09/505,951 
                 6,374,354 
                 7,246,098 
                 6,816,968 
               
               
                 6,757,832 
                 6,334,190 
                 6,745,331 
                 7,249,109 
                 10/636,263 
               
               
                 10/636,283 
                 7,416,280 
                 7,252,366 
                 10/683,064 
                 7,360,865 
               
               
                 10/727,181 
                 10/727,162 
                 7,377,608 
                 7,399,043 
                 7,121,639 
               
               
                 7,165,824 
                 7,152,942 
                 10/727,157 
                 7,181,572 
                 7,096,137 
               
               
                 7,302,592 
                 7,278,034 
                 7,188,282 
                 10/727,159 
                 10/727,180 
               
               
                 10/727,179 
                 10/727,192 
                 10/727,274 
                 10/727,164 
                 10/727,161 
               
               
                 10/727,198 
                 10/727,158 
                 10/754,536 
                 10/754,938 
                 10/727,160 
               
               
                 6,795,215 
                 6,859,289 
                 6,977,751 
                 6,398,332 
                 6,394,573 
               
               
                 6,622,923 
                 6,747,760 
                 6,921,144 
                 10/780,624 
                 7,194,629 
               
               
                 10/791,792 
                 7,182,267 
                 7,025,279 
                 6,857,571 
                 6,817,539 
               
               
                 6,830,198 
                 6,992,791 
                 7,038,809 
                 6,980,323 
                 7,148,992 
               
               
                 7,139,091 
               
               
                   
               
            
           
         
       
     
     BACKGROUND OF THE INVENTION 
     The applicant has designed a six channel pagewidth printhead. In a typical application, the 6 channels will be used to print CMYK plus a fixative and infrared ink. One or more channels can be replaced with another color or substance as required, as long as the printer controller used to feed data to the printhead can cope with the difference. 
     One way of enabling more flexible channel allocation is to provide a cartridge having a different number of channels. A typical approach in prior art printers has been to provide the printhead on a cartridge, such that the cartridge itself can be replaced to change the number of channels or type of ink being used in each channel. One example of this is where a monochrome cartridge can be swapped for a color cartridge. Aside from the hassle of physically changing cartridges, it is also commercially undesirable to have multiple physical printhead types to account for the varying number of channels required in various applications. 
     It would be desirable to provide a multi-channel printhead that offers more flexibility in allocating channels than is presently the case in earlier printheads. 
     SUMMARY OF THE INVENTION 
     In a first aspect the present invention provides a printhead module capable of printing a maximum of n of channels of print data, the printhead module being configurable into:
         a first mode, in which the printhead module is configured to receive print data for a first number of the channels; and   a second mode, in which the printhead module is configured to receive print data for a second number of the channels, wherein the first number is greater than the second number.       

     Optionally the first number is n. 
     Optionally the first number is less than n. 
     Optionally the printhead module is configurable into at least one other mode, in which the printhead is configured to receive print data for a number of print channels other than the first and second numbers. 
     Optionally n is 4 and the second number is less than 4. 
     Optionally n is 5 and the second number is less than 5. 
     Optionally n is 6 and the second number is less than 6. 
     Optionally the second number is 3, 4 or 5. 
     Optionally the selected mode is selected based on the contents of a memory associated with the printhead. 
     Optionally the memory is a register. 
     Optionally the register is on an integrated circuit, and wherein the integrated circuit and the printhead are mounted to a print engine. 
     Optionally printhead comprising a plurality of printhead modules capable of printing a maximum of n of channels of print data, the printhead module being configurable into:
         a first mode, in which the printhead module is configured to receive print data for a first number of the channels; and   a second mode, in which the printhead module is configured to receive print data for a second number of the channels, wherein the first number is greater than the second number.       

     Optionally printhead is a pagewidth printhead. 
     Optionally the printhead module is configured to receive dot data to which a method of at least partially compensating for errors in ink dot placement by at least one of a plurality of nozzles due to erroneous rotational displacement of a printhead module relative to a carrier has been applied, the nozzles being disposed on the printhead module, the method comprising the steps of: 
     (a) determining the rotational displacement; 
     (b) determining at least one correction factor that at least partially compensates for the ink dot displacement; and 
     (c) using the correction factor to alter the output of the ink dots to at least partially compensate for the rotational displacement. 
     Optionally the printhead module is configured to receive dot data to which a method of expelling ink has been applied, the method being applied to a printhead module including at least one row that comprises a plurality of adjacent sets of n adjacent nozzles, each of the nozzles being configured to expel ink in response to a fire signal, the method comprising providing, for each set of nozzles, a fire signal in accordance with the sequence: [nozzle position  1 , nozzle position n, nozzle position  2 , nozzle position (n−1), . . . , nozzle position x], wherein nozzle position x is at or adjacent the centre of the set of nozzles. 
     Optionally the printhead module is configured to receive dot data to which a method of expelling ink has been applied, the method being applied to a printhead module including at least one row that comprises a plurality of sets of n adjacent nozzles, each of the nozzles being configured to expel ink in response to a fire signal, the method comprising the steps of: 
     (a) providing a fire signal to nozzles at a first and nth position in each set of nozzles; 
     (b) providing a fire signal to the next inward pair of nozzles in each set; 
     (c) in the event n is an even number, repeating step (b) until all of the nozzles in each set has been fired; and 
     (d) in the event n is an odd number, repeating step (b) until all of the nozzles but a central nozzle in each set have been fired, and then firing the central nozzle. 
     Optionally the printhead module is manufactured in accordance with a method of manufacturing a plurality of printhead modules, at least some of which are capable of being combined in pairs to form bilithic pagewidth printheads, the method comprising the step of laying out each of the plurality of printhead modules on a wafer substrate, wherein at least one of the printhead modules is right-handed and at least another is left-handed. 
     Optionally the printhead module further including:
         at least one row of print nozzles;   at least two shift registers for shifting in dot data supplied from a data source to each of the at least one rows, wherein each print nozzle obtains dot data to be fired from an element of one of the shift registers.       

     Optionally the printhead module is installed in a printer comprising:
         a printhead comprising at least the first elongate printhead module, the at least one printhead module including at least one row of print nozzles for expelling ink; and   at least first and second printer controllers configured to receive print data and process the print data to output dot data to the printhead, wherein the first and second printer controllers are connected to a common input of the printhead.       

     Optionally the printhead module is installed in a printer comprising:
         a printhead comprising first and second elongate printhead modules, the printhead modules being parallel to each other and being disposed end to end on either side of a join region;   at least first and second printer controllers configured to receive print data and process the print data to output dot data to the printhead, wherein the first printer controller outputs dot data only to the first printhead module and the second printer controller outputs dot data only to the second printhead module, wherein the printhead modules are configured such that no dot data passes between them.       

     Optionally the printhead module is installed in a printer comprising:
         a printhead comprising first and second elongate printhead modules, the printhead modules being parallel to each other and being disposed end to end on either side of a join region, wherein the first printhead module is longer than the second printhead module;   at least first and second printer controllers configured to receive print data and process the print data to output dot data to the printhead, wherein: the first printer controller outputs dot data to both the first printhead module and the second printhead module; and the second printer controller outputs dot data only to the second printhead module.       

     Optionally the printhead module is installed in a printer comprising:
         a printhead comprising first and second elongate printhead modules, the printhead modules being parallel to each other and being disposed end to end on either side of a join region, wherein the first printhead module is longer than the second printhead module;   at least first and second printer controllers configured to receive print data and process the print data to output dot data for the printhead, wherein: the first printer controller outputs dot data to both the first printhead module and the second controller; and the second printer controller outputs dot data to the second printhead module, wherein the dot data output by the second printer controller includes dot data it generates and at least some of the dot data received from the first printer controller.       

     Optionally the printhead module is in communication with a printer controller for supplying dot data to at least one printhead module and at least partially compensating for errors in ink dot placement by at least one of a plurality of nozzles on the printhead module due to erroneous rotational displacement of the printhead module relative to a carrier, the printer being configured to:
         access a correction factor associated with the at least one printhead module;   determine an order in which at least some of the dot data is supplied to at least one of the at least one printhead modules, the order being determined at least partly on the basis of the correction factor, thereby to at least partially compensate for the rotational displacement; and   supply the dot data to the printhead module.       

     Optionally the printhead module is in communication with a printer controller for supplying dot data to a printhead module having a plurality of nozzles for expelling ink, the printhead module including a plurality of thermal sensors, each of the thermal sensors being configured to respond to a temperature at or adjacent at least one of the nozzles, the printer controller being configured to modify operation of at least some of the nozzles in response to the temperature rising above a first threshold. 
     Optionally the printhead module is in communication with a printer controller for controlling a head comprising at least one monolithic printhead module, the at least one printhead module having a plurality of rows of nozzles configured to extend, in use, across at least part of a printable pagewidth of the printhead, the nozzles in each row being grouped into at least first and second fire groups, the printhead module being configured to sequentially fire, for each row, the nozzles of each fire group, such that each nozzle in the sequence from each fire group is fired simultaneously with respective corresponding nozzles in the sequence in the other fire groups, wherein the nozzles are fired row by row such that the nozzles of each row are all fired before the nozzles of each subsequent row, wherein the printer controller is configured to provide one or more control signals that control the order of firing of the nozzles. 
     Optionally the printhead module is, in communication with a printer controller for outputting to a printhead module:
         dot data to be printed with at least two different inks; and   control data for controlling printing of the dot data;   the printer controller including at least one communication output, each or the communication output being configured to output at least some of the control data and at least some of the dot data for the at least two inks.       

     Optionally the printhead module includes at least one row of printhead nozzles, at least one row including at least one displaced row portion, the displacement of the row portion including a component in a direction normal to that of a pagewidth to be printed. 
     Optionally the printhead module is in communication with a printer controller for supplying print data to at least one printhead module capable of printing a maximum of n of channels of print data, the at least one printhead module being configurable into:
         a first mode, in which the printhead module is configured to receive data for a first number of the channels; and   a second mode, in which the printhead module is configured to receive print data for a second number of the channels, wherein the first number is greater than the second number;   wherein the printer controller is selectively configurable to supply dot data for the first and second modes.       

     Optionally the printhead module is in communication with a printer controller for supplying data to a printhead comprising a plurality of printhead modules, the printhead being wider than a reticle step used in forming the modules, the printhead comprising at least two types of the modules, wherein each type is determined by its geometric shape in plan. 
     Optionally the printhead module is used in conjunction with a printer controller for supplying one or more control signals to a printhead module, the printhead module including at least one row that comprises a plurality of sets of n adjacent nozzles, each of the nozzles being configured to expel ink in response to a fire signal, such that: 
     (a) a fire signal is provided to nozzles at a first and nth position in each set of nozzles; 
     (b) a fire signal is provided to the next inward pair of nozzles in each set; 
     (c) in the event n is an even number, step (b) is repeated until all of the nozzles in each set has been fired; and 
     (d) in the event n is an odd number, step (b) is repeated until all of the nozzles but a central nozzle in each set have been fired, and then the central nozzle is fired. 
     Optionally the printhead module is used in conjunction with a printer controller for supplying one or more control signals to a printhead module, the printhead module including at least one row that comprises a plurality of adjacent sets of n adjacent nozzles, each of the nozzles being configured to expel ink in response to a fire signal, the method comprising providing, for each set of nozzles, a fire signal in accordance with the sequence: [nozzle position  1 , nozzle position n, nozzle position  2 , nozzle position (n−1), . . . , nozzle position x], wherein nozzle position x is at or adjacent the centre of the set of nozzles. 
     Optionally the printhead module is in communication with a printer controller for supplying dot data to a printhead module comprising at least first and second rows configured to print ink of a similar type or color, at least some nozzles in the first row being aligned with respective corresponding nozzles in the second row in a direction of intended media travel relative to the printhead, the printhead module being configurable such that the nozzles in the first and second pairs of rows are fired such that some dots output to print media are printed to by nozzles from the first pair of rows and at least some other dots output to print media are printed to by nozzles from the second pair of rows, the printer controller being configurable to supply dot data to the printhead module for printing. 
     Optionally the printhead module is in communication with a printer controller for supplying dot data to at least one printhead module, the at least one printhead module comprising a plurality of rows, each of the rows comprising a plurality of nozzles for ejecting ink, wherein the printhead module includes at least first and second rows configured to print ink of a similar type or color, the printer controller being configured to supply the dot data to the at least one printhead module such that, in the event a nozzle in the first row is faulty, a corresponding nozzle in the second row prints an ink dot at a position on print media at or adjacent a position where the faulty nozzle would otherwise have printed it. 
     Optionally the printhead module is in communication with a printer controller for receiving first data and manipulating the first data to produce dot data to be printed, the print controller including at least two serial outputs for supplying the dot data to at least one printhead. 
     Optionally the printhead module further including:
         at least one row of print nozzles;   at least first and second shift registers for shifting in dot data supplied from a data source, wherein each shift register feeds dot data to a group of nozzles, and wherein each of the groups of the nozzles is interleaved with at least one of the other groups of the nozzles.       

     Optionally the printhead module being capable of printing a maximum of n of channels of print data, the printhead being configurable into:
         a first mode, in which the printhead is configured to receive print data for a first number of the channels; and   a second mode, in which the printhead is configured to receive print data for a second number of the channels, wherein the first number is greater than the second number.       

     Optionally a module further comprising a plurality of printhead modules including:
         at least one row of print nozzles;   at least first and second shift registers for shifting in dot data supplied from a data source, wherein each shift register feeds dot data to a group of nozzles, and wherein each of the groups of the nozzles is interleaved with at least one of the other groups of the nozzles; and   the printhead being wider than a reticle step used in forming the modules, the printhead comprising at least two types of the modules, wherein each type is determined by its geometric shape in plan.       

     Optionally the printhead module includes at least one row that comprises a plurality of sets of n adjacent nozzles, each of the nozzles being configured to expel ink in response to a fire signal, such that, for each set of nozzles, a fire signal is provided in accordance with the sequence: [nozzle position  1 , nozzle position n, nozzle position  2 , nozzle position (n−1), . . . , nozzle position x], wherein nozzle position x is at or adjacent the centre of the set of nozzles. 
     Optionally the printhead module further includes at least one row that comprises a plurality of adjacent sets of n adjacent nozzles, each of the nozzles being configured to expel the ink in response to a fire signal, the printhead being configured to output ink from nozzles at a first and nth position in each set of nozzles, and then each next inward pair of nozzles in each set, until: in the event n is an even number, all of the nozzles in each set has been fired; and in the event n is an odd number, all of the nozzles but a central nozzle in each set have been fired, and then to fire the central nozzle. 
     Optionally a printhead module for receiving dot data to be printed using at least two different inks and control data for controlling printing of the dot data, the printhead module including a communication input for receiving the dot data for the at least two colors and the control data. 
     Optionally a printhead module further includes at least one row of printhead nozzles, at least one row including at least one displaced row portion, the displacement of the row portion including a component in a direction normal to that of a pagewidth to be printed. 
     Optionally a printhead module having a plurality of rows of nozzles configured to extend, in use, across at least part of a printable pagewidth, the nozzles in each row being grouped into at least first and second fire groups, the printhead module being configured to sequentially fire, for each row, the nozzles of each fire group, such that each nozzle in the sequence from each fire group is fired simultaneously with respective corresponding nozzles in the sequence in the other fire groups, wherein the nozzles are fired row by row such that the nozzles of each row are all fired before the nozzles of each subsequent row. 
     Optionally a printhead module further comprising at least first and second rows configured to print ink of a similar type or color, at least some nozzles in the first row being aligned with respective corresponding nozzles in the second row in a direction of intended media travel relative to the printhead, the printhead module being configurable such that the nozzles in the first and second pairs of rows are fired such that some dots output to print media are printed to by nozzles from the first pair of rows and at least some other dots output to print media are printed to by nozzles from the second pair of rows. 
     Optionally a printhead module is in communication with a printer controller for providing data to a printhead module that includes:
         at least one row of print nozzles;   at least first and second shift registers for shifting in dot data supplied from a data source, wherein each shift register feeds dot data to a group of nozzles, and wherein each of the groups of the nozzles is interleaved with at least one of the other groups of the nozzles.       

     Optionally a printhead module having a plurality of nozzles for expelling ink, the printhead module including a plurality of thermal sensors, each of the thermal sensors being configured to respond to a temperature at or adjacent at least one of the nozzles, the printhead module being configured to modify operation of the nozzles in response to the temperature rising above a first threshold. 
     Optionally a printhead module further comprising a plurality of rows, each of the rows comprising a plurality of nozzles for ejecting ink, wherein the printhead module includes at least first and second rows configured to print ink of a similar type or color, and being configured such that, in the event a nozzle in the first row is faulty, a corresponding nozzle in the second row prints an ink dot at a position on print media at or adjacent a position where the faulty nozzle would otherwise have printed it. 
    
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
       
         
           
             
                 
                 
               
                 
                     
                 
               
              
                 
                   FIG. 1. 
                   Single SoPEC A4 Simplex 
                 
                 
                   FIG. 2. 
                   Dual SoPEC A4 Simplex system 
                 
                 
                   FIG. 3. 
                   Dual SoPEC A4 Duplex system 
                 
                 
                   FIG. 4. 
                   Dual SoPEC A3 simplex system 
                 
                 
                   FIG. 5. 
                   Quad SoPEC A3 duplex system 
                 
                 
                   FIG. 6. 
                   SoPEC A4 Simplex system with extra SoPEC used  
                 
                 
                     
                   as DRAM storage 
                 
                 
                   FIG. 7. 
                   SoPEC A4 Simplex system with network connection  
                 
                 
                     
                   to Host PC 
                 
                 
                   FIG. 8. 
                   Document data flow 
                 
                 
                   FIG. 9. 
                   Pages containing different numbers of bands 
                 
                 
                   FIG. 10. 
                   Contents of a page band 
                 
                 
                   FIG. 11. 
                   Page data path from host to SoPEC 
                 
                 
                   FIG. 12. 
                   Page structure 
                 
                 
                   FIG. 13. 
                   SoPEC System Top Level partition 
                 
                 
                   FIG. 14. 
                   Proposed SoPEC CPU memory map (not to scale) 
                 
                 
                   FIG. 15. 
                   Possible USB Topologies for Multi-SoPEC systems 
                 
                 
                   FIG. 16. 
                   CPU block diagram 
                 
                 
                   FIG. 17. 
                   Printhead Nozzle Layout for conceptual 36 Nozzle AB  
                 
                 
                     
                   single segment printhead 
                 
                 
                   FIG. 18. 
                   Paper and printhead nozzles relationship (example with  
                 
                 
                     
                   D 1  = D 2  = 5) 
                 
                 
                   FIG. 19. 
                   Dot line store logical representation 
                 
                 
                   FIG. 20. 
                   Conceptual view of 2 adjacent printhead segments possible 
                 
                 
                     
                   row alignment 
                 
                 
                   FIG. 21. 
                   Conceptual view of 2 adjacent printhead segments row  
                 
                 
                     
                   alignment (as seen by the LLU) 
                 
                 
                   FIG. 22. 
                   Even dot order in DRAM (13312 dot wide line) 
                 
                 
                   FIG. 23. 
                   High level data flow diagram of LLU in context 
                 
                 
                   FIG. 24. 
                   Paper and printhead nozzles relationship (example with  
                 
                 
                     
                   D 1  = D 2  = 5) 
                 
                 
                   FIG. 25. 
                   Conceptual view of vertically misaligned printhead segment  
                 
                 
                     
                   rows (external) 
                 
                 
                   FIG. 26. 
                   Conceptual view of vertically misaligned printhead segment 
                 
                 
                     
                   rows (internal) 
                 
                 
                   FIG. 27. 
                   Conceptual view of color dependent vertically misaligned  
                 
                 
                     
                   printhead segment rows (internal) 
                 
                 
                   FIG. 28. 
                   Conceptual horizontal misalignment between segments 
                 
                 
                   FIG. 29. 
                   Relative positions of dot fired (example cases) 
                 
                 
                   FIG. 30. 
                   PHI to linking printhead connection (Single SoPEC) 
                 
                 
                   FIG. 31. 
                   PHI to linking printhead connection (2 SoPECs) 
                 
                 
                   FIG. 32. 
                   CPU command word format 
                 
                 
                   FIG. 33. 
                   Example data and command sequence on a print head channel 
                 
                 
                   FIG. 34. 
                   PHI block partition 
                 
                 
                   FIG. 35. 
                   Data generator state diagram 
                 
                 
                   FIG. 36. 
                   PHI mode Controller 
                 
                 
                   FIG. 37. 
                   Encoder RTL diagram 
                 
                 
                   FIG. 38. 
                   28-bit scrambler 
                 
                 
                   FIG. 39. 
                   Printing with 1 SoPEC 
                 
                 
                   FIG. 40. 
                   Printing with 2 SoPECs (existing hardware) 
                 
                 
                   FIG. 41. 
                   Each SoPEC generates dot data and writes directly to a  
                 
                 
                     
                   single printhead 
                 
                 
                   FIG. 42. 
                   Each SoPEC generates dot data and writes directly to a  
                 
                 
                     
                   single printhead 
                 
                 
                   FIG. 43. 
                   Two SoPECs generate dots and transmit directly to the  
                 
                 
                     
                   larger printhead 
                 
                 
                   FIG. 44. 
                   Serial Load 
                 
                 
                   FIG. 45. 
                   Parallel Load 
                 
                 
                   FIG. 46. 
                   Two SoPECs generate dot data but only one transmits directly  
                 
                 
                     
                   to the larger printhead 
                 
                 
                   FIG. 47. 
                   Odd and Even nozzles on same shift register 
                 
                 
                   FIG. 48. 
                   Odd and Even nozzles on different shift registers 
                 
                 
                   FIG. 49. 
                   Interwoven shift registers 
                 
                 
                   FIG. 50. 
                   Linking Printhead Concept 
                 
                 
                   FIG. 51. 
                   Linking Printhead 30 ppm 
                 
                 
                   FIG. 52. 
                   Linking Printhead 60 ppm 
                 
                 
                   FIG. 53. 
                   Theoretical 2 tiles assembled as A-chip/A-chip - right angle join 
                 
                 
                   FIG. 54. 
                   Two tiles assembled as A-chip/A-chip 
                 
                 
                   FIG. 55. 
                   Magnification of color n in A-chip/A-chip 
                 
                 
                   FIG. 56. 
                   A-chip/A-chip growing offset 
                 
                 
                   FIG. 57. 
                   A-chip/A-chip aligned nozzles, sloped chip placement 
                 
                 
                   FIG. 58. 
                   Placing multiple segments together 
                 
                 
                   FIG. 59. 
                   Detail of a single segment in a multi-segment configuration 
                 
                 
                   FIG. 60. 
                   Magnification of inter-slope compensation 
                 
                 
                   FIG. 61. 
                   A-chip/B-chip 
                 
                 
                   FIG. 62. 
                   A-chip/B-chip multi-segment printhead 
                 
                 
                   FIG. 63. 
                   Two A-B-chips linked together 
                 
                 
                   FIG. 64. 
                   Two A-B-chips with on-chip compensation 
                 
                 
                   FIG. 65. 
                   Print construction and Nozzle position 
                 
                 
                   FIG. 66. 
                   Conceptual horizontal misplacement between segments 
                 
                 
                   FIG. 67. 
                   Printhead row positioning and default row firing order 
                 
                 
                   FIG. 68. 
                   Firing order of fractionally misaligned segment 
                 
                 
                   FIG. 69. 
                   Example of yaw in printhead IC misplacement 
                 
                 
                   FIG. 70. 
                   Vertical nozzle spacing 
                 
                 
                   FIG. 71. 
                   Single printhead chip plus connection to second chip 
                 
                 
                   FIG. 72. 
                   Two printheads connected to form a larger printhead 
                 
                 
                   FIG. 73. 
                   Colour arrangement. 
                 
                 
                   FIG. 74. 
                   Nozzle Offset at Linking Ends 
                 
                 
                   FIG. 75. 
                   Bonding Diagram 
                 
                 
                   FIG. 76. 
                   MEMS Representation. 
                 
                 
                   FIG. 77. 
                   Line Data Load and Firing, properly placed Printhead, 
                 
                 
                   FIG. 78. 
                   Simple Fire order 
                 
                 
                   FIG. 79. 
                   Micro positioning 
                 
                 
                   FIG. 80. 
                   Measurement convention 
                 
                 
                     
                 
              
             
           
         
       
     
    
    
     DETAILED DESCRIPTION OF PREFERRED EMBODIMENT 
     Various aspects of the preferred and other embodiments will now be described. 
     Also throughout this description, “printhead module” and “printhead” are used somewhat interchangeably. Technically, a “printhead” comprises one or more “printhead modules”, but occasionally the former is used to refer to the latter. It should be clear from the context which meaning should be allocated to any use of the word “printhead”. 
     The SoPEC ASIC (Small office home office Print Engine Controller) is described which is suitable for use in price sensitive SoHo printer products. The SoPEC ASIC is intended to be a relatively low cost solution for linking printhead control, replacing the multichip solutions in larger more professional systems with a single chip. The increased cost competitiveness is achieved by integrating several systems such as a modified PEC1 printing pipeline, CPU control system, peripherals and memory sub-system onto one SoC ASIC, reducing component count and simplifying board design. SoPEC contains features making it suitable for multifunction or “all-in-one” devices as well as dedicated printing systems. 
     Basic features of the preferred embodiment of SoPEC include:
         Continuous 30 ppm operation for 1600 dpi output at A4/Letter.   Linearly scalable (multiple SoPECs) for increased print speed and/or page width.   192 MHz internal system clock derived from low-speed crystal input   PEP processing pipeline, supports up to 6 color channels at 1 dot per channel per clock cycle   Hardware color plane decompression, tag rendering, halftoning and compositing   Data formatting for Linking Printhead   Flexible compensation for dead nozzles, printhead misalignment etc.   Integrated 20 Mbit (2.5 MByte) DRAM for print data and CPU program store   LEON SPARC v8 32-bit RISC CPU   Supervisor and user modes to support multi-threaded software and security   1 kB each of I-cache and D-cache, both direct mapped, with optimized 256-bit fast cache update.   1×USB2.0 device port and 3×USB2.0 host ports (including integrated PHYs)   Support high speed (480 Mbit/sec) and full speed (12 Mbit/sec) modes of USB2.0   Provide interface to host PC, other SoPECs, and external devices e.g. digital camera   Enable alternative host PC interfaces e.g. via external USB/ethernet bridge   Glueless high-speed serial LVDS interface to multiple Linking Printhead chips   64 remappable GPIOs, selectable between combinations of integrated system control components:   2×LSS interfaces for QA chip or serial EEPROM   LED drivers, sensor inputs, switch control outputs   Motor controllers for stepper and brushless DC motors   Microprogrammed multi-protocol media interface for scanner, external RAM/Flash, etc.   112-bit unique ID plus 112-bit random number on each device, combined for security protocol support   IBM Cu-11 0.13 micron CMOS process, 1.5V core supply, 3.3V IO.   208 pin Plastic Quad Flat Pack       

     The preferred embodiment linking printhead produces 1600 dpi bi-level dots. On low-diffusion paper, each ejected drop forms a 22.5 □m diameter dot. Dots are easily produced in isolation, allowing dispersed-dot dithering to be exploited to its fullest. Since the preferred form of the linking printhead is pagewidth and operates with a constant paper velocity, color planes are printed in good registration, allowing dot-on-dot printing. Dot-on-dot printing minimizes ‘muddying’ of midtones caused by inter-color bleed. 
     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 particular number of intensity levels (e.g. 16□16 8 bits for 257 intensity levels). 
     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&#39;s theorem. 
     In practice, contone resolution above about 300 ppi is of limited utility outside special applications such as medical imaging. Offset printing of magazines, for example, uses contone resolutions in the range 150 to 300 ppi. Higher resolutions contribute slightly to color error through the dither. 
     Black text and graphics are reproduced directly using bi-level black dots, and are therefore not anti-aliased (i.e. low-pass filtered) before being printed. Text should therefore be 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). 
     A Netpage printer, for example, may use a contone resolution of 267 ppi (i.e. 1600 dpí 6), and a black text and graphics resolution of 800 dpi. A high end office or departmental printer may use a contone resolution of 320 ppi (1600 dpi/5) and a black text and graphics resolution of 1600 dpi. Both formats are capable of exceeding the quality of commercial (offset) printing and photographic reproduction. 
     The SoPEC device can be used in several printer configurations and architectures. 
     In the general sense, every preferred embodiment SoPEC-based printer architecture will contain:
         One or more SoPEC devices.   One or more linking printheads.   Two or more LSS busses.   Two or more QA chips.   Connection to host, directly via USB2.0 or indirectly.   Connections between SoPECs (when multiple SoPECs are used).       

     The linking printhead is constructed by abutting a number of printhead ICs together. Each SoPEC can drive up to 12 printhead ICs at data rates up to 30 ppm or 6 printhead ICs at data rates up to 60 ppm. For higher data rates, or wider printheads, multiple SoPECs must be used. 
     In a multi-SoPEC system, the primary communication channel is from a USB2.0 Host port on one SoPEC (the ISCMaster), to the USB2.0 Device port of each of the other SoPECs (ISCSlaves). If there are more ISCSlave SoPECs than available USB Host ports on the ISCMaster, additional connections could be via a USB Hub chip, or daisy-chained SoPEC chips. Typically one or more of SoPEC&#39;s GPIO signals would also be used to communicate specific events between multiple SoPECs. 
     In  FIG. 1 , a single SoPEC device is used to control a linking printhead with 11 printhead ICs. The SoPEC receives compressed data from the host through its USB device port. The compressed data is processed and transferred to the printhead. This arrangement is limited to a speed of 30 ppm. The single SoPEC also controls all printer components such as motors, LEDs, buttons etc, either directly or indirectly. 
     In  FIG. 2 , two SoPECs control a single linking printhead, to provide 60 ppm A4 printing. Each SoPEC drives 5 or 6 of the printheads ICs that make up the complete printhead. SoPEC #0 is the ISCMaster, SoPEC #1 is an ISCSlave. The ISCMaster receives all the compressed page data for both SoPECs and re-distributes the compressed data for the ISCSlave over a local USB bus. There is a total of 4 MBytes of page store memory available if required. Note that, if each page has 2 MBytes of compressed data, the USB2.0 interface to the host needs to run in high speed (not full speed) mode to sustain 60 ppm printing. (In practice, many compressed pages will be much smaller than 2 MBytes). The control of printer components such as motors, LEDs, buttons etc, is shared between the 2 SoPECs in this configuration. 
     In  FIG. 3 , two SoPEC devices are used to control two printheads. Each printhead prints to opposite sides of the same page to achieve duplex printing. SoPEC #0 is the ISCMaster, SoPEC #1 is an ISCSlave. The ISCMaster receives all the compressed page data for both SoPECs and re-distributes the compressed data for the ISCSlave over a local USB bus. This configuration could print 30 double-sided pages per minute. 
     In  FIG. 4 , two SoPEC devices are used to control one A3 linking printhead, constructed from 16 printhead ICs. Each SoPEC controls 8 printhead ICs. This system operates in a similar manner to the 60 ppm A4 system in  FIG. 2 , although the speed is limited to 30 ppm at A3, since each SoPEC can only drive 6 printhead ICs at 60 ppm speeds. A total of 4 Mbyte of page store is available, this allows the system to use compression rates as in a single SoPEC A4 architecture, but with the increased page size of A3. 
     In  FIG. 5  a four SoPEC system is shown. It contains 2 A3 linking printheads, one for each side of an A3 page. Each printhead contain 16 printhead ICs, each SoPEC controls 8 printhead ICs. SoPEC #0 is the ISCMaster with the other SoPECs as ISCSlaves. Note that all 3 USB Host ports on SoPEC #0 are used to communicate with the 3 ISCSlave SoPECs. In total, the system contains 8 Mbytes of compressed page store (2 Mbytes per SoPEC), so the increased page size does not degrade the system print quality, from that of an A4 simplex printer. The ISCMaster receives all the compressed page data for all SoPECs and re-distributes the compressed data over the local USB bus to the ISCSlaves. This configuration could print 30 double-sided A3 sheets per minute. 
     Extra SoPECs can be used for DRAM storage e.g. in  FIG. 6  an A4 simplex printer can be built with a single extra SoPEC used for DRAM storage. The DRAM SoPEC can provide guaranteed bandwidth delivery of data to the printing SoPEC. SoPEC configurations can have multiple extra SoPECs used for DRAM storage. 
       FIG. 7  shows a configuration in which the connection from the host PC to the printer is an ethernet network, rather than USB. In this case, one of the USB Host ports on SoPEC interfaces to a external device that provide ethernet-to-USB bridging. Note that some networking software support in the bridging device might be required in this configuration. A Flash RAM will be required in such a system, to provide SoPEC with driver software for the Ethernet bridging function. 
     Because of the page-width nature of the linking printhead, each page must be printed at a constant speed to avoid creating visible artifacts. This means that the printing speed can&#39;t be varied to match the input data rate. Document rasterization and document printing are therefore decoupled to ensure the printhead has a constant supply of data. A page is never printed until it is fully rasterized. This can be achieved by storing a compressed version of each rasterized page image in memory. 
     This decoupling also allows the RIP(s) to run ahead of the printer when rasterizing simple pages, buying time to rasterize more complex pages. 
     Because contone color images are reproduced by stochastic dithering, but black text and line graphics are reproduced directly using dots, the compressed page image format contains a separate foreground bi-level black layer and background contone color layer. The black layer is composited over the contone layer after the contone layer is dithered (although the contone layer has an optional black component). A final layer of Netpage tags (in infrared, yellow or black ink) is optionally added to the page for printout. 
       FIG. 8  shows the flow of a document from computer system to printed page. 
     At 267 ppi for example, an A4 page (8.26 inches C 11.7 inches) of contone CMYK data has a size of 26.3 MB. At 320 ppi, an A4 page of contone data has a size of 37.8 MB. Using lossy contone compression algorithms such as JPEG, contone images compress with a ratio up to 10:1 without noticeable loss of quality, giving compressed page sizes of 2.63 MB at 267 ppi and 3.78 MB at 320 ppi. 
     At 800 dpi, an A4 page of bi-level data has a size of 7.4 MB. At 1600 dpi, a Letter page of bi-level data has a size of 29.5 MB. Coherent data such as text compresses very well. Using lossless bi-level compression algorithms such as SMG4 fax, ten-point plain text compresses with a ratio of about 50:1. Lossless bi-level compression across an average page is about 20:1 with 10:1 possible for pages which compress poorly. The requirement for SoPEC is to be able to print text at 10:1 compression. Assuming 10:1 compression gives compressed page sizes of 0.74 MB at 800 dpi, and 2.95 MB at 1600 dpi. 
     Once dithered, a page of CMYK contone image data consists of 116 MB of bi-level data. Using lossless bi-level compression algorithms on this data is pointless precisely because the optimal dither is stochastic—i.e. since it introduces hard-to-compress disorder. 
     Netpage tag data is optionally supplied with the page image. Rather than storing a compressed bi-level data layer for the Netpage tags, the tag data is stored in its raw form. Each tag is supplied up to 120 bits of raw variable data (combined with up to 56 bits of raw fixed data) and covers up to a 6 mm □ 6 mm area (at 1600 dpi). The absolute maximum number of tags on a A4 page is 15,540 when the tag is only 2 mm □ 2 mm (each tag is 126 dots □ 126 dots, for a total coverage of 148 tags 105 tags). 15,540 tags of 128 bits per tag gives a compressed tag page size of 0.24 MB. 
     The multi-layer compressed page image format therefore exploits the relative strengths of lossy JPEG contone image compression, lossless bi-level text compression, and tag encoding. The format is compact enough to be storage-efficient, and simple enough to allow straightforward real-time expansion during printing. 
     Since text and images normally don&#39;t overlap, the normal worst-case page image size is image only, while the normal best-case page image size is text only. The addition of worst case Netpage tags adds 0.24 MB to the page image size. The worst-case page image size is text over image plus tags. The average page size assumes a quarter of an average page contains images. 
     The Host PC rasterizes and compresses the incoming document on a page by page basis. The page is restructured into bands with one or more bands used to construct a page. The compressed data is then transferred to the SoPEC device directly via a USB link, or via an external bridge e.g. from ethernet to USB. A complete band is stored in SoPEC embedded memory. Once the band transfer is complete the SoPEC device reads the compressed data, expands the band, normalizes contone, bi-level and tag data to 1600 dpi and transfers the resultant calculated dots to the linking printhead. 
     The document data flow is
         The RIP software rasterizes each page description and compress the rasterized page image.   The infrared layer of the printed page optionally contains encoded Netpage tags at a programmable density.   The compressed page image is transferred to the SoPEC device via the USB (or ethernet), normally on a band by band basis.   The print engine takes the compressed page image and starts the page expansion.   The first stage page expansion consists of 3 operations performed in parallel   expansion of the JPEG-compressed contone layer   expansion of the SMG4 fax compressed bi-level layer   encoding and rendering of the bi-level tag data.   The second stage dithers the contone layer using a programmable dither matrix, producing up to four bi-level layers at full-resolution.   The third stage then composites the bi-level tag data layer, the bi-level SMG4 fax de-compressed layer and up to four bi-level JPEG de-compressed layers into the full-resolution page image.   A fixative layer is also generated as required.   The last stage formats and prints the bi-level data through the linking printhead via the printhead interface.       

     The SoPEC device can print a full resolution page with 6 color planes. Each of the color planes can be generated from compressed data through any channel (either JPEG compressed, bi-level SMG4 fax compressed, tag data generated, or fixative channel created) with a maximum number of 6 data channels from page RIP to linking printhead color planes. 
     The mapping of data channels to color planes is programmable. This allows for multiple color planes in the printhead to map to the same data channel to provide for redundancy in the printhead to assist dead nozzle compensation. 
     Also a data channel could be used to gate data from another data channel. For example in stencil mode, data from the bilevel data channel at 1600 dpi can be used to filter the contone data channel at 320 dpi, giving the effect of 1600 dpi edged contone images, such as 1600 dpi color text. 
     The SoPEC is a page rendering engine ASIC that takes compressed page images as input, and produces decompressed page images at up to 6 channels of bi-level dot data as output. The bi-level dot data is generated for the Memjet linking printhead. The dot generation process takes account of printhead construction, dead nozzles, and allows for fixative generation. 
     A single SoPEC can control up to 12 linking printheads and up to 6 color channels at &gt;10,000 lines/sec, equating to 30 pages per minute. A single SoPEC can perform full-bleed printing of A4 and Letter pages. The 6 channels of colored ink are the expected maximum in a consumer SOHO, or office Memjet printing environment:
         CMY, for regular color printing.   K, for black text, line graphics and gray-scale printing.   IR (infrared), for Netpage-enabled applications.   F (fixative), to enable printing at high speed. Because the Memjet printer is capable of printing so fast, a fixative may be required on specific media types (such as calendared paper) to enable the ink to dry before the page touches a previously printed page. Otherwise the pages may bleed on each other. In low speed printing environments, and for plain and photo paper, the fixative is not be required.       

     SoPEC is color space agnostic. Although it can accept contone data as CMYX or RGBX, where X is an optional 4th channel (such as black), it also can accept contone data in any print color space. Additionally, SoPEC provides a mechanism for arbitrary mapping of input channels to output channels, including combining dots for ink optimization, generation of channels based on any number of other channels etc. However, inputs are typically CMYK for contone input, K for the bi-level input, and the optional Netpage tag dots are typically rendered to an infra-red layer. A fixative channel is typically only generated for fast printing applications. 
     SoPEC is resolution agnostic. It merely provides a mapping between input resolutions and output resolutions by means of scale factors. The expected output resolution is 1600 dpi, but SoPEC actually has no knowledge of the physical resolution of the linking printhead. 
     SoPEC is page-length agnostic. Successive pages are typically split into bands and downloaded into the page store as each band of information is consumed and becomes free. 
     SoPEC provides mechanisms for synchronization with other SoPECs. This allows simple multi-SoPEC solutions for simultaneous A3/A4/Letter duplex printing. However, SoPEC is also capable of printing only a portion of a page image. Combining synchronization functionality with partial page rendering allows multiple SoPECs to be readily combined for alternative printing requirements including simultaneous duplex printing and wide format printing. Table 1 lists some of the features and corresponding benefits of SoPEC. 
     
       
         
           
               
               
             
               
                 TABLE 1 
               
               
                   
               
               
                 Feature 
                 Benefits 
               
               
                   
               
             
            
               
                 Optimised print 
                 30 ppm full page photographic quality color 
               
               
                 architecture in hardware 
                 printing from a desktop PC 
               
               
                 0.13 micron CMOS 
                 High speed 
               
               
                 (&gt;36 million transistors) 
                 Low cost 
               
               
                   
                 High functionality 
               
               
                 900 Million dots per 
                 Extremely fast page generation 
               
               
                 second 
               
               
                 &gt;10,000 lines per second 
                 0.5 A4/Letter pages per SoPEC chip per 
               
               
                 at 1600 dpi 
                 second 
               
               
                 1 chip drives up to 
                 Low cost page-width printers 
               
               
                 92,160 nozzles 
               
               
                 1 chip drives up to 6 
                 99% of SoHo printers can use 1 SoPEC 
               
               
                 color planes 
                 device 
               
               
                 Integrated DRAM 
                 No external memory required, leading to low 
               
               
                   
                 cost systems 
               
               
                 Power saving sleep mode 
                 SoPEC can enter a power saving sleep mode 
               
               
                   
                 to reduce power dissipation between print 
               
               
                   
                 jobs 
               
               
                 JPEG expansion 
                 Low bandwidth from PC 
               
               
                   
                 Low memory requirements in printer 
               
               
                 Lossless bitplane 
                 High resolution text and line art with low 
               
               
                 expansion 
                 bandwidth from PC. 
               
               
                 Netpage tag expansion 
                 Generates interactive paper 
               
               
                 Stochastic dispersed dot 
                 Optically smooth image quality 
               
               
                 dither 
                 No moire effects 
               
               
                 Hardware compositor for 
                 Pages composited in real-time 
               
               
                 6 image planes 
               
               
                 Dead nozzle 
                 Extends printhead life and yield 
               
               
                 compensation 
                 Reduces printhead cost 
               
               
                 Color space agnostic 
                 Compatible with all inksets and image 
               
               
                   
                 sources including RGB, CMYK, spot, CIE 
               
               
                   
                 L*a*b*, hexachrome, YCrCbK, sRGB and 
               
               
                   
                 other 
               
               
                 Color space conversion 
                 Higher quality/lower bandwidth 
               
               
                 USB2.0 device interface 
                 Direct, high speed (480 Mb/s) interface to host 
               
               
                   
                 PC. 
               
               
                 USB2.0 host interface 
                 Enables alternative host PC connection types 
               
               
                   
                 (IEEE1394, Ethernet, WiFi, Bluetooth etc.). 
               
               
                   
                 Enables direct printing from digital camera or 
               
               
                   
                 other device. 
               
               
                 Media Interface 
                 Direct connection to a wide range of external 
               
               
                   
                 devices e.g. scanner 
               
               
                 Integrated motor 
                 Saves expensive external hardware. 
               
               
                 controllers 
               
               
                 Cascadable in resolution 
                 Printers of any resolution 
               
               
                 Cascadable in color 
                 Special color sets e.g. hexachrome can be 
               
               
                 depth 
                 used 
               
               
                 Cascadable in image size 
                 Printers of any width 
               
               
                 Cascadable in pages 
                 Printers can print both sides simultaneously 
               
               
                 Cascadable in speed 
                 Higher speeds are possible by having each 
               
               
                   
                 SoPEC print one vertical strip of the page. 
               
               
                 Fixative channel data 
                 Extremely fast ink drying without wastage 
               
               
                 generation 
               
               
                 Built-in security 
                 Revenue models are protected 
               
               
                 Undercolor removal on 
                 Reduced ink usage 
               
               
                 dot-by-dot basis 
               
               
                 Does not require fonts 
                 No font substitution or missing fonts 
               
               
                 for high speed operation 
               
               
                 Flexible printhead 
                 Many configurations of printheads are 
               
               
                 configuration 
                 supported by one chip type 
               
               
                 Drives linking printheads 
                 No print driver chips required, results in 
               
               
                 directly 
                 lower cost 
               
               
                 Determines dot accurate 
                 Removes need for physical ink monitoring 
               
               
                 ink usage 
                 system in ink cartridges 
               
               
                   
               
            
           
         
       
     
     The required printing rate for a single SoPEC is 30 sheets per minute with an inter-sheet spacing of 4 cm. To achieve a 30 sheets per minute print rate, this requires:
         300 mm×63 (dot/mm)/2 sec=105.8 □seconds per line, with no inter-sheet gap.   340 mm×63 (dot/mm)/2 sec=93.3 □seconds per line, with a 4 cm inter-sheet gap.       

     A printline for an A4 page consists of 13824 nozzles across the page. At a system clock rate of 192 MHz, 13824 dots of data can be generated in 69.2 □seconds. Therefore data can be generated fast enough to meet the printing speed requirement. 
     Once generated, the data must be transferred to the printhead. Data is transferred to the printhead ICs using a 288 MHz clock (3/2 times the system clock rate). SoPEC has 6 printhead interface ports running at this clock rate. Data is 8b/10b encoded, so the thoughput per port is 0.8×288=230.4 Mb/sec. For 6 color planes, the total number of dots per printhead IC is 1280×6=7680, which takes 33.3 □seconds to transfer. With 6 ports and 11 printhead ICs, 5 of the ports address 2 ICs sequentially, while one port addresses one IC and is idle otherwise. This means all data is transferred on 66.7 □seconds (plus a slight overhead). Therefore one SoPEC can transfer data to the printhead fast enough for 30 ppm printing. 
     From the highest point of view the SoPEC device consists of 3 distinct subsystems
         CPU Subsystem   DRAM Subsystem   Print Engine Pipeline (PEP) Subsystem       

     See  FIG. 13  for a block level diagram of SoPEC. 
     The CPU subsystem controls and configures all aspects of the other subsystems. It provides general support for interfacing and synchronising the external printer with the internal print engine. It also controls the low speed communication to the QA chips. The CPU subsystem contains various peripherals to aid the CPU, such as GPIO (includes motor control), interrupt controller, LSS Master, MMI and general timers. The CPR block provides a mechanism for the CPU to powerdown and reset individual sections of SoPEC. The UDU and UHU provide high-speed USB2.0 interfaces to the host, other SoPEC devices, and other external devices. For security, the CPU supports user and supervisor mode operation, while the CPU subsystem contains some dedicated security components. 
     The DRAM subsystem accepts requests from the CPU, UHU, UDU, MMI and blocks within the PEP subsystem. The DRAM subsystem (in particular the DIU) arbitrates the various requests and determines which request should win access to the DRAM. The DIU arbitrates based on configured parameters, to allow sufficient access to DRAM for all requesters. The DIU also hides the implementation specifics of the DRAM such as page size, number of banks, refresh rates etc. 
     The Print Engine Pipeline (PEP) subsystem accepts compressed pages from DRAM and renders them to bi-level dots for a given print line destined for a printhead interface that communicates directly with up to 12 linking printhead ICs. 
     The first stage of the page expansion pipeline is the CDU, LBD and TE. The CDU expands the JPEG-compressed contone (typically CMYK) layer, the LBD expands the compressed bi-level layer (typically K), and the TE encodes Netpage tags for later rendering (typically in IR, Y or K ink). The output from the first stage is a set of buffers: the CFU, SFU, and TFU. The CFU and SFU buffers are implemented in DRAM. 
     The second stage is the HCU, which dithers the contone layer, and composites position tags and the bi-level spoto layer over the resulting bi-level dithered layer. A number of options exist for the way in which compositing occurs. Up to 6 channels of bi-level data are produced from this stage. Note that not all 6 channels may be present on the printhead. For example, the printhead may be CMY only, with K pushed into the CMY channels and IR ignored. Alternatively, the position tags may be printed in K or Y if IR ink is not available (or for testing purposes). 
     The third stage (DNC) compensates for dead nozzles in the printhead by color redundancy and error diffusing dead nozzle data into surrounding dots. 
     The resultant bi-level 6 channel dot-data (typically CMYK-IRF) is buffered and written out to a set of line buffers stored in DRAM via the DWU. 
     Finally, the dot-data is loaded back from DRAM, and passed to the printhead interface via a dot FIFO. The dot FIFO accepts data from the LLU up to 2 dots per system clock cycle, while the PHI removes data from the FIFO and sends it to the printhead at a maximum rate of 1.5 dots per system clock cycle. 
     Looking at  FIG. 13 , the various units are described here in summary form: 
     
       
         
           
               
               
               
               
             
               
                 TABLE 2 
               
               
                   
               
               
                   
                 Unit 
                   
                   
               
               
                 Sub- 
                 Acro- 
               
               
                 system 
                 nym 
                 Unit Name 
                 Description 
               
               
                   
               
             
            
               
                 DRAM 
                 DIU 
                 DRAM 
                 Provides the interface for DRAM 
               
               
                   
                   
                 interface unit 
                 read and write access for the various 
               
               
                   
                   
                   
                 PEP units, CPU, UDU, UHU and 
               
               
                   
                   
                   
                 MMI. The DIU provides arbitration 
               
               
                   
                   
                   
                 between competing units controls 
               
               
                   
                   
                   
                 DRAM access. 
               
               
                   
                 DRAM 
                 Embedded 
                 20 Mbits of embedded DRAM, 
               
               
                   
                   
                 DRAM 
               
               
                 CPU 
                 CPU 
                 Central 
                 CPU for system configuration and 
               
               
                   
                   
                 Processing 
                 control 
               
               
                   
                   
                 Unit 
               
               
                   
                 MMU 
                 Memory 
                 Limits access to certain memory 
               
               
                   
                   
                 Management 
                 address areas in CPU user mode 
               
               
                   
                   
                 Unit 
               
               
                   
                 RDU 
                 Real-time 
                 Facilitates the observation of the 
               
               
                   
                   
                 Debug Unit 
                 contents of most of the CPU 
               
               
                   
                   
                   
                 addressable registers in SoPEC in 
               
               
                   
                   
                   
                 addition to some pseudo-registers in 
               
               
                   
                   
                   
                 realtime. 
               
               
                   
                 TIM 
                 General 
                 Contains watchdog and general 
               
               
                   
                   
                 Timer 
                 system timers 
               
               
                   
                 LSS 
                 Low Speed 
                 Low level controller for interfacing 
               
               
                   
                   
                 Serial 
                 with the QA chips 
               
               
                   
                   
                 Interfaces 
               
               
                   
                 GPIO 
                 General 
                 General IO controller, with built-in 
               
               
                   
                   
                 Purpose IOs 
                 Motor control unit, LED pulse units 
               
               
                   
                   
                   
                 and de-glitch circuitry 
               
               
                   
                 MMI 
                 Multi-Media 
                 Generic Purpose Engine for protocol 
               
               
                   
                   
                 Interface 
                 generation and control with 
               
               
                   
                   
                   
                 integrated DMA controller. 
               
               
                   
                 ROM 
                 Boot ROM 
                 16 KBytes of System Boot ROM 
               
               
                   
                   
                   
                 code 
               
               
                   
                 ICU 
                 Interrupt 
                 General Purpose interrupt controller 
               
               
                   
                   
                 Controller 
                 with configurable priority, and 
               
               
                   
                   
                 Unit 
                 masking. 
               
               
                   
                 CPR 
                 Clock, Power 
                 Central Unit for controlling and 
               
               
                   
                   
                 and Reset 
                 generating the system clocks and 
               
               
                   
                   
                 block 
                 resets and powerdown mechanisms 
               
               
                   
                 PSS 
                 Power Save 
                 Storage retained while system is 
               
               
                   
                   
                 Storage 
                 powered down 
               
               
                   
                 USB 
                 Universal 
                 USB multiport (4) physical interface. 
               
               
                   
                 PHY 
                 Serial Bus 
               
               
                   
                   
                 (USB) 
               
               
                   
                   
                 Physical 
               
               
                   
                 UHU 
                 USB Host 
                 USB host controller interface with 
               
               
                   
                   
                 Unit 
                 integrated DIU DMA controller 
               
               
                   
                 UDU 
                 USB Device 
                 USB Device controller interface with 
               
               
                   
                   
                 Unit 
                 integrated DIU DMA controller 
               
               
                 Print 
                 PCU 
                 PEP 
                 Provides external CPU with the 
               
               
                 Engine 
                   
                 controller 
                 means to read and write PEP Unit 
               
               
                 Pipeline 
                   
                   
                 registers, and read and write DRAM 
               
               
                 (PEP) 
                   
                   
                 in single 32-bit chunks. 
               
               
                   
                 CDU 
                 Contone 
                 Expands JPEG compressed contone 
               
               
                   
                   
                 decoder 
                 layer and writes decompressed 
               
               
                   
                   
                 unit 
                 contone to DRAM 
               
               
                   
                 CFU 
                 Contone 
                 Provides line buffering between 
               
               
                   
                   
                 FIFO Unit 
                 CDU and HCU 
               
               
                   
                 LBD 
                 Lossless 
                 Expands compressed bi-level layer. 
               
               
                   
                   
                 Bi-level 
               
               
                   
                   
                 Decoder 
               
               
                   
                 SFU 
                 Spot FIFO 
                 Provides line buffering between 
               
               
                   
                   
                 Unit 
                 LBD and HCU 
               
               
                   
                 TE 
                 Tag encoder 
                 Encodes tag data into line of tag 
               
               
                   
                   
                   
                 dots. 
               
               
                   
                 TFU 
                 Tag FIFO 
                 Provides tag data storage between 
               
               
                   
                   
                 Unit 
                 TE and HCU 
               
               
                   
                 HCU 
                 Halftoner 
                 Dithers contone layer and 
               
               
                   
                   
                 compositor 
                 composites the bi-level spot 0 and 
               
               
                   
                   
                 unit 
                 position tag dots. 
               
               
                   
                 DNC 
                 Dead 
                 Compensates for dead nozzles by 
               
               
                   
                   
                 Nozzle 
                 color redundancy and error diffusing 
               
               
                   
                   
                 Compensator 
                 dead nozzle data into surrounding 
               
               
                   
                   
                   
                 dots. 
               
               
                   
                 DWU 
                 Dotline 
                 Writes out the 6 channels of dot data 
               
               
                   
                   
                 Writer 
                 for a given printline to the line store 
               
               
                   
                   
                 Unit 
                 DRAM 
               
               
                   
                 LLU 
                 Line Loader 
                 Reads the expanded page image from 
               
               
                   
                   
                 Unit 
                 line store, formatting the data 
               
               
                   
                   
                   
                 appropriately for the linking 
               
               
                   
                   
                   
                 printhead. 
               
               
                   
                 PHI 
                 PrintHead 
                 Is responsible for sending dot data to 
               
               
                   
                   
                 Interface 
                 the linking printheads and for 
               
               
                   
                   
                   
                 providing line synchronization 
               
               
                   
                   
                   
                 between multiple SoPECs. Also 
               
               
                   
                   
                   
                 provides test interface to printhead 
               
               
                   
                   
                   
                 such as temperature monitoring and 
               
               
                   
                   
                   
                 Dead Nozzle Identification. 
               
               
                   
               
            
           
         
       
     
     SoPEC must address
         20 Mbit DRAM.   PCU addressed registers in PEP.   CPU-subsystem addressed registers.       

     SoPEC has a unified address space with the CPU capable of addressing all CPU-subsystem and PCU-bus accessible registers (in PEP) and all locations in DRAM. The CPU generates byte-aligned addresses for the whole of SoPEC. 22 bits are sufficient to byte address the whole SoPEC address space. 
     The embedded DRAM is composed of 256-bit words. Since the CPU-subsystem may need to write individual bytes of DRAM, the DIU is byte addressable. 22 bits are required to byte address 20 Mbits of DRAM. 
     Most blocks read or write 256-bit words of DRAM. For these blocks only the top 17 bits i.e. bits  21  to  5  are required to address 256-bit word aligned locations. 
     The exceptions are
         CDU which can write 64-bits so only the top 19 address bits i.e. bits  21 - 3  are required.   The CPU-subsystem always generates a 22-bit byte-aligned DIU address but it will send flags to the DIU indicating whether it is an 8, 16 or 32-bit write.   The UHU and UDU generate 256-bit aligned addresses, with a byte-wise write mask associated with each data word, to allow effective byte addressing of the DRAM.       

     Regardless of the size no DIU access is allowed to span a 256-bit aligned DRAM word boundary. 
     PEP Unit configuration registers which specify DRAM locations should specify 256-bit aligned DRAM addresses i.e. using address bits  21 : 5 . Legacy blocks from PEC1 e.g. the LBD and TE may need to specify 64-bit aligned DRAM addresses if these reused blocks DRAM addressing is difficult to modify. These 64-bit aligned addresses require address bits  21 : 3 . However, these 64-bit aligned addresses should be programmed to start at a 256-bit DRAM word boundary. Unlike PEC1, there are no constraints in SoPEC on data organization in DRAM except that all data structures must start on a 256-bit DRAM boundary. If data stored is not a multiple of 256-bits then the last word should be padded. 
     The CPU subsystem bus supports 32-bit word aligned read and write accesses with variable access timings. 
     The PCU only supports 32-bit register reads and writes for the PEP blocks. As the PEP blocks only occupy a subsection of the overall address map and the PCU is explicitly selected by the MMU when a PEP block is being accessed the PCU does not need to perform a decode of the higher-order address bits. 
     The CPU block consists of the CPU core, caches, MMU, RDU and associated logic. The principal tasks for the program running on the CPU to fulfill in the system are: 
     Communications: 
     
         
         
           
             Control the flow of data to and from the USB interfaces to and from the DRAM 
             Communication with the host via USB 
             Communication with other USB devices (which may include other SoPECs in the system, digital cameras, additional communication devices such as ethernet-to-USB chips) when SoPEC is functioning as a USB host 
             Communication with other devices (utilizing the MMI interface block) via miscellaneous protocols (including but not limited to Parallel Port, Generic 68K/i960 CPU interfaces, serial interfaces Intel SBB, Motorola SPI etc.). 
             Running the USB device drivers 
             Running additional protocol stacks (such as ethernet)
 
PEP Subsystem Control:
 
             Page and band header processing (may possibly be performed on host PC) 
             Configure printing options on a per band, per page, per job or per power cycle basis 
             Initiate page printing operation in the PEP subsystem 
             Retrieve dead nozzle information from the printhead and forward to the host PC or process locally 
             Select the appropriate firing pulse profile from a set of predefined profiles based on the printhead characteristics 
             Retrieve printhead information (from printhead and associated serial flash)
 
Security:
 
             Authenticate downloaded program code 
             Authenticate printer operating parameters 
             Authenticate consumables via the PRINTER_QA and INK_QA chips 
             Monitor ink usage 
             Isolation of OEM code from direct access to the system resources
 
Other:
 
             Drive the printer motors using the GPIO pins 
             Monitoring the status of the printer (paper jam, tray empty etc.) 
             Driving front panel LEDs and/or other display devices 
             Perform post-boot initialisation of the SoPEC device 
             Memory management (likely to be in conjunction with the host PC) 
             Handling higher layer protocols for interfaces implemented with the MMI 
             Image processing functions such as image scaling, cropping, rotation, white-balance, color space conversion etc. for printing images directly from digital cameras (e.g. via PictBridge application software) 
             Miscellaneous housekeeping tasks 
           
         
       
    
     To control the Print Engine Pipeline the CPU is required to provide a level of performance at least equivalent to a 16-bit Hitachi H8-3664 microcontroller running at 16 MHz. An as yet undetermined amount of additional CPU performance is needed to perform the other tasks, as well as to provide the potential for such activity as Netpage page assembly and processing, RIPing etc. The extra performance required is dominated by the signature verification task, direct camera printing image processing functions (i.e. color space conversion) and the USB (host and device) management task. A number of CPU cores have been evaluated and the LEON P1754 is considered to be the most appropriate solution. A diagram of the CPU block is shown in  FIG. 16 . 
     The Dotline Writer Unit (DWU) receives 1 dot (6 bits) of color information per cycle from the DNC. Dot data received is bundled into 256-bit words and transferred to the DRAM. The DWU (in conjunction with the LLU) implements a dot line FIFO mechanism to compensate for the physical placement of nozzles in a printhead, and provides data rate smoothing to allow for local complexities in the dot data generate pipeline. 
     The physical placement of nozzles in the printhead means that in one firing sequence of all nozzles, dots will be produced over several print lines. The printhead consists of up to 12 rows of nozzles, one for each color of odd and even dots. Nozzles rows of the same color are separated by D 1  print lines and nozzle rows of different adjacent colors are separated by D 2  print lines. See  FIG. 17  for reference. The first color to be printed is the first row of nozzles encountered by the incoming paper. In the example this is color 0 odd, although is dependent on the printhead type. Paper passes under printhead moving upwards. 
     Due to the construction limitations the printhead can have nozzles mildly sloping over several lines, or a vertical alignment discontinuity at potentially different horizontal positions per row (D 3 ). The DWU doesn&#39;t need any knowledge of the discontinuities only that it stores sufficient lines in the dot store to allow the LLU to compensate. 
       FIG. 17  shows a possible vertical misalignment of rows within a printhead segment. There will also be possible vertical and horizontal misalignment of rows between adjacent printhead segments. 
     The DWU compensates for horizontal misalignment of nozzle rows within printhead segments, and writes data out to half line buffers so that the LLU is able to compensate for vertical misalignments between and within printhead segments. The LLU also compensates for the horizontal misalignment between a printhead segment. 
     For example if the physical separation of each half row is 80 □m equating to D 1 =D 2 =5 print lines at 1600 dpi. This means that in one firing sequence, color 0 odd nozzles  1 - 17  will fire on dotline L, color 0 even nozzles  0 - 16  will fire on dotline L-D 1 , color 1 odd nozzles  1 - 17  will fire on dotline L-D 1 -D 2  and so on over 6 color planes odd and even nozzles. The total number of physical lines printed onto over a single line time is given as (0+5+5 . . . +5)+1=11×5+1=56. See  FIG. 18  for example diagram. 
     It is expected that the physical spacing of the printhead nozzles will be 80 □m (or 5 dot lines), although there is no dependency on nozzle spacing. The DWU is configurable to allow other line nozzle spacings. 
     The DWU block is required to compensate for the physical spacing between lines of nozzles. It does this by storing dot lines in a FIFO (in DRAM) until such time as they are required by the LLU for dot data transfer to the printhead interface. Colors are stored separately because they are needed at different times by the LLU. The dot line store must store enough lines to compensate for the physical line separation of the printhead but can optionally store more lines to allow system level data rate variation between the read (printhead feed) and write sides (dot data generation pipeline) of the FIFOs. 
     A logical representation of the FIFOs is shown in  FIG. 19 , where N is defined as the optional number of extra half lines in the dot line store for data rate de-coupling. 
     If the printhead contains nozzles sloping over X lines or a vertical misalignment of Y lines then the DWU must store N&gt;X and N&gt;Y lines in the dotstore to allow the LLU to compensate for the nozzle slope and any misalignment. It is also possible that the effects of a slope, and a vertical misalignment are accumulative, in such cases N&gt;(X+Y). 
     The DNC and the DWU concept of line lengths can be different. The DNC can be programmed to produce less dots than the DWU expects per line, or can be programmed to produce an odd number of dots (the DWU always expect an even number of dots per line). The DWU produces NozzleSkewPadding more dots than it excepts from the DNC per line. If the DNC is required to produce an odd number of dots, the NozzleSkewPadding value can be adjusted to ensure the output from the DWU is still even. The relationship of line lengths between DWU and DNC must always satisfy:
 
(LineSize+1)*2−NozzleSkewPadding==DncLineLength
 
     For an arbitrary page width of d dots (where d is even), the number of dots per half line is d/2. 
     For interline spacing of D 2  and inter-color spacing of D 1 , with C colors of odd and even half lines, the number of half line storage is (C−1)(D 2 +D 1 )+D 1 . 
     For N extra half line stores for each color odd and even, the storage is given by (N*C*2). 
     The total storage requirement is ((C−1)(D 2 +D 1 )+D 1 +(N*C*2))*d/2 in bits. 
     Note that when determining the storage requirements for the dot line store, the number of dots per line is the page width and not necessarily the printhead width. The page width is often the dot margin number of dots less than the printhead width. They can be the same size for full bleed printing. 
     For example in an A4 page a line consists of 13824 dots at 1600 dpi, or 6912 dots per half dot line. To store just enough dot lines to account for an inter-line nozzle spacing of 5 dot lines it would take 55 half dot lines for color 5 odd, 50 dot lines for color 5 even and so on, giving 55+50+45 . . . 10+5+0=330 half dot lines in total. If it is assumed that N=4 then the storage required to store 4 extra half lines per color is 4×12=48, in total giving 330+48=378 half dot lines. Each half dot line is 6912 dots, at 1 bit per dot give a total storage requirement of 6912 dots×378 half dot lines/8 bits=Approx 319 Kbytes. Similarly for an A3 size page with 19488 dots per line, 9744 dots per half line×378 half dot lines/8=Approx 450 Kbytes. 
     The potential size of the dot line store makes it unfeasible to be implemented in on-chip SRAM, requiring the dot line store to be implemented in embedded DRAM. This allows a configurable dotline store where unused storage can be redistributed for use by other parts of the system. 
     Due to construction limitations of the printhead it is possible that nozzle rows within a printhead segment may be misaligned relative to each other by up to 5 dots per half line, which means 56 dot positions over 12 half lines (i.e. 28 dot pairs). Vertical misalignment can also occur but is compensated for in the LLU and not considered here. The DWU is required to compensate for the horizontal misalignment. 
     Dot data from the HCU (through the DNC) produces a dot of 6 colors all destined for the same physical location on paper. If the nozzle rows in the within a printhead segment are aligned as shown in  FIG. 17  then no adjustment of the dot data is needed. 
     A conceptual misaligned printhead is shown in  FIG. 20 . The exact shape of the row alignment is arbitrary, although is most likely to be sloping (if sloping, it could be sloping in either direction). 
     The DWU is required to adjust the shape of the dot streams to take into account the relative horizontal displacement of nozzles rows between 2 adjacent printhead segments. The LLU compensates for the vertical skew between printhead segments, and the vertical and horizontal skew within printhead segments. The nozzle row skew function aligns rows to compensate for the seam between printhead segments (as shown in  FIG. 20 ) and not for the seam within a printhead (as shown in  FIG. 17 ). The DWU nozzle row function results in aligned rows as shown in the example in  FIG. 21 . 
     To insert the shape of the skew into the dot stream, for each line we must first insert the dots for non-printable area  1 , then the printable area data (from the DNC), and then finally the dots for non-printable area  2 . This can also be considered as: first produce the dots for non-printable area  1  for line n, and then a repetition of:
         produce the dots for the printable area for line n (from the DNC)   produce the dots for the non-printable area  2  (for line n) followed by the dots of non-printable area  1  (for line n+1)       

     The reason for considering the problem this way is that regardless of the shape of the skew, the shape of non-printable area  2  merged with the shape of non-printable area  1  will always be a rectangle since the widths of non-printable areas  1  and  2  are identical and the lengths of each row are identical. Hence step  2  can be accomplished by simply inserting a constant number (NozzleSkewPadding) of 0 dots into the stream. 
     For example, if the color n even row non-printable area  1  is of length X, then the length of color n even row non-printable area  2  will be of length NozzleSkewPadding−X. The split between non-printable areas  1  and  2  is defined by the NozzleSkew registers. 
     Data from the DNC is destined for the printable area only, the DWU must generate the data destined for the non-printable areas, and insert DNC dot data correctly into the dot data stream before writing dot data to the fifos. The DWU inserts the shape of the misalignment into the dot stream by delaying dot data destined to different nozzle rows by the relative misalignment skew amount. 
     An embedded DRAM is expected to be of the order of 256 bits wide, which results in 27 words per half line of an A4 page, and 39 words per half line of A3. This requires 27 words×12 half colors (6 colors odd and even)=324×256-bit DRAM accesses over a dotline print time, equating to 6 bits per cycle (equal to DNC generate rate of 6 bits per cycle). Each half color is required to be double buffered, while filling one buffer the other buffer is being written to DRAM. This results in 256 bits×2 buffers×12 half colors i.e. 6144 bits in total. With 2× buffering the average and peak DRAM bandwidth requirement is the same and is 6 bits per cycle. 
     Should the DWU fail to get the required DRAM access within the specified time, the DWU will stall the DNC data generation. The DWU will issue the stall in sufficient time for the DNC to respond and still not cause a FIFO overrun. Should the stall persist for a sufficiently long time, the PHI will be starved of data and be unable to deliver data to the printhead in time. The sizing of the dotline store FIFO and internal FIFOs should be chosen so as to prevent such a stall happening. 
     The dot data shift register order in the printhead is shown in  FIG. 17  (the transmit order is the opposite of the shift register order). In the example shown dot  1 , dot  3 , dot  5 , . . . , dot  33 , dot  35  would be transmitted to the printhead in that order. As data is always transmitted to the printhead in increasing order it is beneficial to store the dot lines in increasing order to facilitate easy reading and transfer of data by the LLU and PHI. 
     For each line in the dot store the order is the same (although for odd lines the numbering will be different the order will remain the same). Dot data from the DNC is always received in increasing dot number order. The dot data is bundled into 256-bit words and written in increasing order in DRAM, word  0  first, then word  1 , and so on to word N, where N is the number of words in a line. The starting point for the first dot in a DRAM word is configured by the AlignmentOffset register. 
     The dot order in DRAM is shown in  FIG. 22 . 
     The start address for each half color N is specified by the ColorBaseAdr[N] registers and the end address (actually the end address plus 1) is specified by the ColorBaseAdr[N+1]. Note there are 12 colors in total, 0 to 11, the ColorBaseAdr[12] register specifies the end of the color 11 dot FIFO and not the start of a new dot FIFO. As a result the dot FIFOs must be specified contiguously and increasing in DRAM. 
     As each line is written to the FIFO, the DWU increments the FifoFillLevel register, and as the LLU reads a line from the FIFO the FifoFillLevel register is decremented. The LLU indicates that it has completed reading a line by a high pulse on the llu_dwu_line_rd line. 
     When the number of lines stored in the FIFO is equal to the MaxWriteAhead value the DWU will indicate to the DNC that it is no longer able to receive data (i.e. a stall) by deasserting the dwu_dnc_ready signal. 
     The ColorEnable register determines which color planes should be processed, if a plane is turned off, data is ignored for that plane and no DRAM accesses for that plane are generated. 
     The Line Loader Unit (LLU) reads dot data from the line buffers in DRAM and structures the data into even and odd dot channels destined for the same print time. The blocks of dot data are transferred to the PHI and then to the printhead.  FIG. 23  shows a high level data flow diagram of the LLU in context. 
     The DWU re-orders dot data into 12 separate dot data line FIFOs in the DRAM. Each FIFO corresponds to 6 colors of odd and even data. The LLU reads the dot data line FIFOs and sends the data to the printhead interface. The LLU decides when data should be read from the dot data line FIFOs to correspond with the time that the particular nozzle on the printhead is passing the current line. The interaction of the DWU and LLU with the dot line FIFOs compensates for the physical spread of nozzles firing over several lines at once.  FIG. 24  shows the physical relationship between nozzle rows and the line time the LLU starts reading from the dot line store. A printhead is constructed from printhead segments. One A4 printhead can be constructed from up to 11 printhead segments. A single LLU needs to be capable of driving up to 11 printhead segments, although it may be required to drive less. The LLU will read this data out of FIFOs written by the DWU, one FIFO per half-color. 
     The PHI needs to send data out over 6 data lines, each data line may be connected to up to two segments. When printing A4 portrait, there will be 11 segments. This means five of the data lines will have two segments connected and one will have a single segment connected (any printhead channel could have a single segment connected). In a dual SoPEC system, one of the SoPECs will be connected to 5 segments, while the other is connected to 6 segments. 
     Focusing for a moment on the single SoPEC case, SoPEC maintains a data generation rate of 6 bits per cycle throughout the data calculation path. If all 6 data lines broadcast for the entire duration of a line, then each would need to sustain 1 bit per cycle to match SoPECs internal processing rate. However, since there are 11 segments and 6 data lines, one of the lines has only a single segment attached. This data line receives only half as much data during each print line as the other data lines. So if the broadcast rate on a line is 1 bit per cycle, then we can only output at a sustained rate of 5.5 bits per cycle, thus not matching the internal generation rate. These lines therefore need an output rate of at least 6/5.5 bits per cycle. 
     Due to clock generation limitations in SoPEC the PHI datalines can transport data at 6/5 bits per cycle, slightly faster than required. 
     While the data line bandwidth is slightly more than is needed, the bandwidth needed is still slightly over 1 bit per cycle, and the LLU data generators that prepare data for them must produce data at over 1 bit per cycle. To this end the LLU will target generating data at 2 bits per cycle for each data line. 
     The LLU will have 6 data generators. Each data generator will produce the data for either a single segment, or for 2 segments. In cases where a generator is servicing multiple segments the data for one entire segment is generated first before the next segments data is generated. Each data generator will have a basic data production rate of 2 bits per cycle, as discussed above. The data generators need to cater to variable segment width. The data generators will also need to cater for the full range of printhead designs currently considered plausible. Dot data is generated and sent in increasing order. 
     What has to be dealt with in the LLU is summarized here. 
     The generators need to be able to cope with segments being vertically offset. This could be due to poor placement and assembly techniques, or due to each printhead segment being placed slightly above or below the previous printhead segment. 
     They need to be able to cope with the segments being placed at mild slopes. The slopes being discussed and planned for are of the order of 5-10 lines across the width of the printhead (termed Sloped Step). 
     It is necessary to cope with printhead segments that have a single internal step of 3-10 lines thus avoiding the need for continuous slope. Note the term step is used to denote when the LLU changes the dot line it is reading from in the dot line store. To solve this we will reuse the mild sloping facility, but allow the distance stepped back to be arbitrary, thus it would be several steps of one line in most mild sloping arrangements and one step of several lines in a single step printhead. SoPEC should cope with a broad range of printhead sizes. It is likely that the printheads used will be 1280 dots across. Note this is 640 dots/nozzles per half color. 
     It is also necessary that the LLU be able to cope with a single internal step, where the step position varies per nozzle row within a segment rather than per segment (termed Single Step). 
     The LLU can compensate for either a Sloped Step or Single Step, and must compensate all segments in the printhead with the same manner. 
     Due to construction limitations of the linking printhead it is possible that nozzle rows may be misaligned relative to each other. Odd and even rows, and adjacent color rows may be horizontally misaligned by up to 5 dot positions relative to each other. Vertical misalignment can also occur between printhead segments used to construct the printhead. The DWU compensates for some horizontal misalignment issues, and the LLU compensates for the vertical misalignments and some horizontal misalignment. 
     The vertical skew between printhead segments can be different between any 2 segments. For example the vertical difference between segment A and segment B (Vertical skew AB) and between segment B and segment C (Vertical skew BC) can be different. 
     The LLU compensates for this by maintaining a different set of address pointers for each segment. The segment offset register (SegDRAMOffset) specifies the number of DRAM words offset from the base address for a segment. It specifies the number of DRAM words to be added to the color base address for each segment, and is the same for all odd colors and even colors within that segment. The SegDotOffset specifies the bit position within that DRAM word to start processing dots, there is one register for all even colors and one for all odd colors within that segment. The segment offset is programmed to account for a number of dot lines, and compensates for the printhead segment mis-alignment. For example in the diagram above the segment offset for printhead segment B is SegWidth+(LineLength*3) in DRAM words. 
     Vertical skew within a segment can take the form of either a single step of 3-10 lines, or a mild slope of 5-10 lines across the length of the printhead segment. Both types of vertical skew are compensated for by the LLU using the same mechanism, but with different programming. 
     Within a segment there may be a mild slope that the LLU must compensate for by reading dot data from different parts of the dot store as it produces data for a segment. Every SegSpan number of dot pairs the LLU dot generator must adjust the address pointer by StepOffset. The StepOffset is added to the address pointer but a negative offset can be achieved by setting StepOffset sufficiently large enough to wrap around the dot line store. When a dot generator reaches the end of a segment span and jumps to the new DRAM word specified by the offset, the dot pointer (pointing to the dot within a DRAM word) continues on from the same position it finished. It is possible (and likely) that the span step will not align with a segment edge. The span counter must start at a configured value (ColorSpanStart) to compensate for the mis-alignment of the span step and the segment edge. 
     The programming of the ColorSpanStart, StepOffset and SegSpan can be easily reprogrammed to account for the single step case. 
     All segments in a printhead are compensated using the same ColorSpanStart, StepOffset and SegSpan settings, no parameter can be adjusted on a per segment basis. 
     With each step jump not aligned to a 256-bit word boundary, data within a DRAM word will be discarded. This means that the LLU must have increased DRAM bandwidth to compensate for the bandwidth lost due to data getting discarded. 
     The LLU is also required to compensate for color row dependant vertical step offset. The position of the step offset is different for each color row and but the amount of the offset is the same per color row. Color dependent vertical skew will be the same for all segments in the printhead. 
     The color dependant step compensation mechanism is a variation of the sloped and single step mechanisms described earlier. The step offset position within a printhead segment varies per color row. The step offset position is adjusted by setting the span counter to different start values depending on the color row being processed. The step offset is defined as SegSpan−ColorSpanStart[N] where N specifies the color row to process. 
     In the skewed edge sloped step case it is likely the mechanism will be used to compensate for effects of the shape of the edge of the printhead segment. In the skewed edge single step case it is likely the mechanism will be used to compensate for the shape of the edge of the printhead segment and to account for the shape of the internal edge within a segment. 
     The LLU is required to compensate for horizontal misalignments between printhead segments.  FIG. 28  shows possible misalignment cases. 
     In order for the LLU to compensate for horizontal misalignment it must deal with 3 main issues
         Swap odd/even dots to even/odd nozzle rows (case  2  and  4 )   Remove duplicated dots (case  2  and  4 )   Read dots on a dot boundary rather than a dot pair       

     In case  2  the second printhead segment is misaligned by one dot. To compensate for the misalignment the LLU must send odd nozzle data to the even nozzle row, and even nozzle data to the odd nozzle row in printhead segment  2 . The OddAligned register configures if a printhead segment should have odd/even data swapped, when set the LLU reads even dot data and transmits it to the odd nozzle row (and visa versa). 
     When data is swapped, nozzles in segment  2  will overlap with nozzles in segment  1  (indicated in  FIG. 28 ), potentially causing the same dot data to be fired twice to the same position on the paper. To prevent this the LLU provides a mechanism whereby the first dots in a nozzle row in a segment are zeroed or prevented from firing. The SegStartDotRemove register configures the number of starting dots (up to a maximum of 3 dots) in a row that should be removed or zeroed out on a per segment basis. For each segment there are 2 registers one for even nozzle rows and one for odd nozzle rows. 
     Another consequence of nozzle row swapping, is that nozzle row data destined for printhead segment  2  is no longer aligned. Recall that the DWU compensates for a fixed horizontal skew that has no knowledge of odd/even nozzle data swapping. Notice that in Case  2   b  in  FIG. 28  that odd dot data destined for the even nozzle row of printhead segment  2  must account for the 3 missing dots between the printhead segments, whereas even dot data destined for the odd nozzle row of printhead segment  2  must account for the 2 duplicate dots at the start of the nozzle row. The LLU allows for this by providing different starting offsets for odd and even nozzles rows and a per segment basis. The SegDRAMOffset and SegDotOffset registers have 12 sets of 2 registers, one set per segment, and within a set one register per odd/even nozzle row. The SegDotOffset register allows specification of dot offsets on a dot boundary. 
     The LLU (in conjunction with sub-line compensation in printhead segments) is required to compensate for sub-line vertical skew between printhead segments. 
       FIG. 29  shows conceptual example cases to illustrate the sub-line compensation problem. 
     Consider a printhead segment with 10 rows each spaced exactly 5 lines apart. The printhead segment takes 100 us to fire a complete line, 10 us per row. The paper is moving continuously while the segment is firing, so row  0  will fire on line A, row  1  will 10 us later on Line A+0.1 of a line, and so on until to row  9  which is fire 90 us later on line A+0.9 of a line (note this assumes the 5 line row spacing is already compensated for). The resultant dot spacing is shown in case  1 A in  FIG. 29 . 
     If the printhead segment is constructed with a row spacing of 4.9 lines and the LLU compensates for a row spacing of 5 lines, case  1 B will result with all nozzle rows firing exactly on top of each other. Row  0  will fire on line A, row  1  will fire 10 us later and the paper will have moved 0.1 line, but the row separation is 4.9 lines resulting in row  1  firing on line A exactly, (line A+4.9 lines physical row spacing−5 lines due to LLU row spacing compensation+0.1 lines due to 10 us firing delay=line A). 
     Consider segment  2  that is skewed relative to segment  1  by 0.3 of a line. A normal printhead segment without sub-line adjustment would print similar to case  2 A. A printhead segment with sub-line compensation would print similar to case  2 B, with dots from all nozzle rows landing on Line A+segment skew (in this case 0.3 of a line). 
     If the firing order of rows is adjusted, so instead of firing rows  0 , 1 , 2  . . .  9 , the order is  3 , 4 , 5  . . .  8 , 9 , 0 , 1 , 2 , and a printhead with no sub-line compensation is used a pattern similar to case  2 C will result. A dot from nozzle row  3  will fire at line A+segment skew, row  4  at line A+segment skew+0.1 of a line etc. (note that the dots are now almost aligned with segment  1 ). If a printhead with sub-line compensation is used, a dot from nozzle row  3  will fire on line A, row  4  will fire on line A and so on to row  9 , but rows  0 , 1 , 2  will fire on line B (as shown in case  2 D). The LLU is required to compensate for normal row spacing (in this case spacing of 5 lines), it needs to also compensate on a per row basis for a further line due to sub-line compensation adjustments in the printhead. In case  2 D, the firing pattern and resulting dot locations for rows  0 , 1 , 2  means that these rows would need to be loaded with data from the following line of a page in order to be printing the correct dot data to the correct position. When the LLU adjustments are applied and a sub-line compensating printhead segment is used a dot pattern as shown in case  2 E will result, compensating for the sub-line skew between segment  1  and  2 . 
     The LLU is configured to adjust the line spacing on a per row per segment basis by programming the SegColorRowInc registers, one register per segment, and one bit per row. 
     The specific sub-line placement of each row, and subsequent standard firing order is dependant on the design of the printhead in question. However, for any such firing order, a different ordering can be constructed, like in the above sample, that results in sub-line correction. And while in the example above it is the first three rows which required adjustment it might equally be the last three or even three non-contiguous rows that require different data than normal when this facility is engaged. To support this flexibly the LLU needs to be able to specify for each segment a set of rows for which the data is loaded from one line further into the page than the default programming for that half-color. 
     The LLU provides a mechanism for generating left and right margin dot data, for transmission to the printhead. In the margin areas the LLU will generate zero data and will not read data from DRAM for margin dots, saving some DRAM bandwidth. 
     The left margin is specified by the LeftMarginEnd and LeftMarginSegment registers. The LeftMarginEnd specifies the dot position that the left margin ends, and the LeftMarginSegment register specifies which segment the margin ends in. The LeftMarginEnd allows a value up the segment size, but larger margins can be specified by selecting further in segments in the printhead, and disabling interim segments. 
     The right margin is specified by the RightMarginStart and RightMarginSegment registers. The RightMarginStart specifies the dot position that the right margin starts, and the RightMarginSegment register specifies which segment the margin start in. 
     The LLU contains 6 dot generators, each of which generate data in a fixed but configurable order for easy transmission to the printhead. Each dot generator can produce data for 0, 1 or 2 printhead segments, and is required to produce dots at a rate of 2 dots per cycle. The number of printhead segments is configured by the SegConfig register. The SegConfig register is a map of active segments. The dot generators will produce zero data for inactive segments and dot data for active segments. Register  0 , bits  5 : 0  of SegConfig specifies group 0 active segments, and register  1  bits  5 : 0  specify group 1 active segments (in each case one bit per generator). The number of groups of segments is configured by the MaxSegment register. 
     Group 0 segments are defined as the group of segments that are supplied with data first from each generator (segments  0 , 2 , 4 , 6 , 8 , 10 ), and group 1 segments are supplied with data second from each generator (segments  1 , 3 , 5 , 7 , 9 , 11 ). 
     The 6 dot generators transfer data to the PHI together, therefore they must generate the same volume of data regardless of the number of segments each is driving. If a dot generator is configured to drive 1 segment then it must generate zero data for the remaining printhead segment. 
     If MaxSegment is set to 0 then all generators will generate data for one segment only, if it&#39;s set to 1 then all generators will produce data for 2 segments. The SegConfig register controls if the data produced is dot data or zero data. 
     For each segment that a generator is configured for, it will produce up to N half colors of data configured by the MaxColor register. The MaxColor register should be set to values less than 12 when GenerateOrder is set to 0 and less then 6 when GenerateOrder is 1. 
     For each color enabled the dot generators will transmit one half color of dot data (possibly even data) first in increasing order, and then one half color of dot data in increasing order (possibly odd data). The number of dots produced for each half color (i.e. an odd or even color) is configured by the SegWidth register. 
     The half color generation order is configured by the OddAligned and GenerateOrder registers. The GenerateOrder register effects all generators together, whereas the OddAligned register configures the generation order on a per segment basis. 
     At the start of a page the LLU must wait for the dot line store in DRAM to fill to a configured level (given by FifoReadThreshold) before starting to read dot data. Once the LLU starts processing dot data for a page it must continue until the end of a page, the DWU (and other PEP blocks in the pipeline) must ensure there is always data in the dot line store for the LLU to read, otherwise the LLU will stall, causing the PHI to stall and potentially generate a print error. The FifoReadThreshold should be chosen to allow for data rate mismatches between the DWU write side and the LLU read side of the dot line FIFO. The LLU will not generate any dot data until the FifoReadThreshold level in the dot line FIFO is reached. 
     Once the FifoReadThreshold is reached the LLU begins page processing, the FifoReadThreshold is ignored from then on. 
     For each dot line FIFO there are conceptually 12 pointers (one per segment) reading from it, each skewed by a number of dot lines in relation to the other (the skew amount could be positive or negative). Determining the exact number of valid lines in the dot line store is complicated by having several pointers reading from different positions in the FIFO. It is convenient to remove the problem by pre-zeroing the dot line FIFOs effectively removing the need to determine exact data validity. The dot FIFOs can be initialized in a number of ways, including
         the CPU writing 0s,   the LBD/SFU writing a set of 0 lines (16 bits per cycle),   the HCU/DNC/DWU being programmed to produce 0 data       

     The LLU is required to generate data for feeding to the printhead interface, the rate required is dependent on the printhead construction and on the line rate configured. Each dot generator in the LLU can generate dots at a rate of 2 bits per cycle, this gives a maximum of 12 bits per cycle (for 6 dot generators). The SoPEC data generation pipeline (including the DWU) maintains a data rate of 6 bits per cycle. 
     The PHI can transfer data to each printhead segment at maximum raw rate of 288 Mb/s, but allowing for line sync and control word overhead of ˜2%, and 8b10b encoding, the effective bandwidth is 225 Mb/s or 1.17 bits per pclk cycle per generator. So a 2 dots per cycle generation rate easily meets the LLU to PHI bandwidth requirements. 
     To keep the PHI fully supplied with data the LLU would need to produce 1.17×6=7.02 bits per cycle. This assumes that there are 12 segments connected to the PHI. The maximum number of segments the PHI will have connected is 11, so the LLU needs to produce data at the rate of 11/12 of 7.02 or approx 6.43 bits per cycle. This is slightly greater than the front end pipeline rate of 6 bits per cycle. 
     The printhead construction can introduce a gentle slope (or line discontinuities) that is not perfectly 256 bit aligned (the size of a DRAM word), this can cause the LLU to retrieve 256 bits of data from DRAM but only use a small amount of it, the remainder resulting in wasted DRAM bandwidth. The DIU bandwidth allocation to the LLU will need to be increased to compensate for this wasted bandwidth. 
     For example if the LLU only uses on average 128 bits out of every 256 bits retrieved from the DRAM, the LLU bandwidth allocation in the DIU will need to be increased to 2×6.43=12.86 bits per cycle. 
     It is possible in certain localized cases the LLU will use only 1 bit out of some DRAM words, but this would be local peak, rather than an average. As a result the LLU has quad buffers to average out local peak bandwidth requirements. 
     Note that while the LLU and PHI could produce data at greater than 6 bits per cycle rate, the DWU can only produce data at 6 bits per cycle rate, therefore a single SoPEC will only be able to sustain an average of 6 bits per cycle over the page print duration (unless there are significant margins for the page). If there are significant margins the LLU can operate at a higher rate than the DWU on average, as the margin data is generated by the LLU and not written by the DWU. The start address for each half color N is specified by the ColorBaseAdr[N] registers and the end address (actually the end address plus 1) is specified by the ColorBaseAdr[N+1]. Note there are 12 colors in total, 0 to 11, the ColorBaseAdr[12] register specifies the end of the color 11 dot FIFO and not the start of a new dot FIFO. As a result the dot FIFOs must be specified contiguously and increasing in DRAM. 
     The LLU keeps a dot usage count for each of the color planes (called AccumDotCount). If a dot is used in a particular color plane the corresponding counter is incremented. Each counter is 32 bits wide and saturates if not reset. A write to the InkDotCountSnap register causes the AccumDotCount[N] values to be transferred to the InkDotCount[N] registers (where N is 5 to 0, one per color). The AccumDotCount registers are cleared on value transfer. 
     The InkDotCount[N] registers can be written to or read from by the CPU at any time. On reset the counters are reset to zero. 
     The dot counter only counts dots that are passed from the LLU through the PHI to the printhead. Any dots generated by direct CPU control of the PHI pins will not be counted. 
     The Printhead interface (PHI) accepts dot data from the LLU and transmits the dot data to the printhead, using the printhead interface mechanism. The PHI generates the control and timing signals necessary to load and drive the printhead. A printhead is constructed from a number of printhead segments. The PHI has 6 transmission lines (printhead channel), each line is capable of driving up to 2 printhead segments, allowing a single PHI to drive up to 12 printhead segments. The PHI is capable of driving any combination of 0, 1 or 2 segments on any printhead channel. 
     The PHI generates control information for transmission to each printhead segment. The control information can be generated automatically by the PHI based on configured values, or can be constructed by the CPU for the PHI to insert into the data stream. 
     The PHI transmits data to printhead segments at a rate of 288 Mhz, over 6 LVDS data lines synchronous to 2 clocks. Both clocks are in phase with each other. In order to assist sampling of data in the printhead segments, each data line is encoded with 8b10b encoding, to minimize the maximum number of bits without a transition. Each data line requires a continuous stream of symbols, if a data line has no data to send it must insert IDLE symbols to enable the receiving printhead to remain synchronized. The data is also scrambled to reduce EMI effects due to long sequences of identical data sent to the printhead segment (i.e. IDLE symbols between lines). The descrambler also has the added benefit in the receiver of increasing the chance single bit errors will be seen multiple times. The 28-bit scrambler is self-synchronizing with a feedback polynomial of 1+x 15 +x 28 . 
     The PHI needs to send control commands to each printhead segment as part of the normal line and page download to each printhead segment. The control commands indicate line position, color row information, fire period, line sync pulses etc. to the printhead segments. 
     A control command consists of one control symbol, followed by 0 or more data or control symbols. A data or control symbol is defined as a 9-bit unencoded word. A data symbol has bit  8  set to 0, the remaining 8 bits represent the data character. A control symbol has bit  8  set to 1, with the 8 remaining bits set to a limited set of other values to complete the 8b10b code set. Each command is defined by CmdCfg[CMD_NAME] register. The command configuration register configures 2 pointers into a symbol array (currently the symbol array is 32 words, but could be extended). Bits  4 : 0  of the command configuration register indicate the start symbol, and bits  9 : 5  indicate the end symbol. Bit  10  is the empty string bit and is used to indicate that the command is empty, when set the command is ignored and no symbols are sent. When a command is transmitted to a printhead segment, the symbol pointed to by the start pointer is send first, then the start pointer+1 etc. and all symbols to the end symbol pointer. If the end symbol pointer is less than the start symbol pointer the PHI will send all symbols from start to stop wrapping at 32. 
     The IDLE command is configured differently to the others. It is always only one symbol in length and cannot be configured to be empty. The IDLE symbol value is defined by the IdleCmdCfg register. 
     The symbol array can be programmed by accessing the SymbolTable registers. Note that the symbol table can be written to at any time, but can only be read when Go is set to 0. 
     The PHI provides a mechanism for the CPU to send data and control words to any individual segment or to broadcast to all segments simultaneously. The CPU writes commands to the command FIFO, and the PHI accepts data from the command FIFO, and transmits the symbols to the addressed printhead segment, or broadcasts the symbols to all printhead segments. 
     The CPU command is of the form: 
     The 9-bit symbol can be a control or data word, the segment address indicates which segment the command should be sent to. Valid segment addresses are 0-11 and the broadcast address is 15. There is a direct mapping of segment addresses to printhead data lines, segment addresses  0  and  1  are sent out printhead channel  0 , addresses  2  and  3  are sent out printhead channel  1 , and so on to addresses  10  and  11  which are send out printhead channel  5 . The end of command (EOC) flag indicates that the word is the last word of a command. In multi-word commands the segment address for the first word determines which printhead channel the command gets sent to, the segment address field in subsequent words is ignored. 
     The PHI operates in 2 modes, CPU command mode and data mode. A CPU command always has higher priority than the data stream (or a stream of idles) for transmission to the printhead. When there is data in the command FIFO, the PHI will change to CPU command mode as soon as possible and start transmitting the command word. If the PHI detects data in the command FIFO, and the PHI is in the process of transmitting a control word the PHI waits for the control word to complete and then switches to CPU command mode. Note that idles are not considered control words. The PHI will remain in CPU command mode until it encounters a command word with the EOC flag set and no other data in the command FIFO. 
     The PHI must accept data for all printhead channels from the LLU together, and transmit all data to all printhead segments together. If the CPU command FIFO wants to send data to a particular printhead segment, the PHI must stall all data channels from the LLU, and send IDLE symbols to all other print channels not addressed by the CPU command word. If the PHI enters CPU command mode and begins to transmit command words, and the command FIFO becomes empty but the PHI has not encountered an EOC flag then the PHI will continue to stall the LLU and insert IDLE symbols into the print streams. The PHI remains in CPU command mode until an EOC flag is encountered. 
     To prevent such stalling the command FIFO has an enable bit CmdFIFOEnable which enables the PHI reading the command FIFO. It allows the CPU to write several words to the command FIFO without the PHI beginning to read the FIFO. If the CPU disables the FIFO (setting CmdFIFOEnable to 0) and the PHI is currently in CPU command mode, the PHI will continue transmitting the CPU command until it encounters an EOC flag and will then disable the FIFO. 
     When the PHI is switching from CPU command mode to data transfer mode, it sends a RESUME command to the printhead channel group data transfer that was interrupted. This enables each printhead to easily differentiate between control and data streams. For example if the PHI is transmitting data to printhead group B and is interrupted to transmit a CPU command, then upon return to data mode the PHI must send a RESUME_B control command. If the PHI was between pages (when Go=0) transmitting IDLE commands and was interrupted by a CPU command, it doesn&#39;t need to send any resume command before returning to transmit IDLE. 
     The command FIFO can be written to at any time by the CPU by writing to the CmdFifo register. The CmdFiFO register allows FIFO style access to the command FIFO. Writing to the CmdFIFO register will write data to the command FIFO address pointed to by the write pointer and will increment the write pointer. The CmdFIFO register can be read at any time but will always return the command FIFO value pointed to by the internal read pointer. 
     The current fill level of the CPU command FIFO can be read by accessing the CmdFIFOLevel register. 
     The command FIFO is 32 words×14 bits. 
     The PHI synchronizes line data transmission with sync pulses generated by the GPIO block (which in turn could be synchronized to the GPIO block in another SoPEC). The PHI waits for a line sync pulse and then transmits line data and the FIRE command to all printhead segments. 
     It is possible that when a line sync pulse arrives at the PHI that not all the data has finished being sent to the printheads. If the PHI were to forward this signal on then it would result in an incorrect print of that line, which is an error condition. This would indicate a buffer underflow in PEC1. 
     However, in SoPEC the printhead segments can only receive line sync signals from the SoPEC providing them data. Thus it is possible that the PHI could delay in sending the line sync pulse until it had finished providing data to the printhead. The effect of this would be a line that is printed slightly after where it should be printed. In a single SoPEC system this effect would probably not be noticeable, since all printhead segments would have undergone the same delay. In a multi-SoPEC system delays would cause a difference in the location of the lines, if the delay was great this may be noticeable. 
     If a line sync is early the PHI records it as a pending line sync and will send the corresponding next line and FIRE command at the next available time (i.e. when the current line of data is finished transferring to the printhead). It is possible that there may be multiple pending line syncs, whether or not this is an error condition is printer specific. The PHI records all pending line syncs (LineSyncPend register), and if the level of pending lines syncs rises over a configured level (LineSyncMaxPend register) the PHI will set the MaxSyncPend bit in the PhiStatus register which if enabled can cause an interrupt. The CPU interrupt service routine can then evaluate the appropriate response, which could involve halting the PHI. 
     The PHI also has 2 print speed limitation mechanisms. The LineTimeMin register specifies the minimum line time period in pclk cycles and the DynLineTimeMin register which also specifies the minimum line time period in pclk cycles but is updated dynamically after each FIRE command is transmitted. The PHI calculates DynLineTimeCalcMin value based on the last line sync period adjusted by a scale factor specified by the DynLineTimeMinScaleNum register. When a FIRE command is transmitted to the printhead the PHI moves the DynLineTimeCalcMin to the DynLineTimeMin register to limit the next line time. The DynLineTimeCalcMin value is updated for each new line sync (same as the FirePeriodCalc) whereas the DynLineTimeMin register is updated when a FIRE command is transmitted to the printhead (same as the FirePeriod register). The dynamic minimum line time is intended to ensure the previous calculated fire period will have sufficient time to fire a complete line before the PHI begins sending the next line of data. 
     The scale factor is defined as the ratio of the DynLineTimeMinScaleNum numerator value to a fixed denominator value of 0x10000, allowing a maximum scale factor of 1. 
     The PHI also provides a mechanism where it can generate an interrupt to the ICU (phi_icu_line_irq) after a fixed number of line syncs are received or a fixed number of FIRE commands are sent to the printhead. The LineInterrupt register specifies the number of line syncs (or FIRE commands) to count before the interrupt is generated and the LineInterruptSrc register selects if the count should be line syncs or FIRE commands. 
     The PHI sends data to each printhead segment in a fixed order inserting the appropriate control command sequences into the data stream at the correct time. The PHI receives a fixed data stream from the LLU, it is the responsibility of the PHI to determine which data is destined for which line, color nozzle row and printhead segment, and to insert the correct command sequences. 
     The SegWidth register specifies the number of dot pairs per half color nozzle row. To avoid padding to the nearest 8 bits (data symbol input amount) the SegWidth must be programmed to a multiple of 8. 
     The MaxColor register specifies the number of half nozzle rows per printhead segment. 
     The MaxSegment specifies the maximum number segments per printhead channel. If MaxSegment is set to 0 then all enabled channels will generate a data stream for one segment only. If MaxSegment is set to 1 then all enabled channels will generate data for 2 segments. The LLU will generate null data for any missing printhead segments. 
     The PageLenLine register specifies the number of lines of data to accept from the LLU and transfer to the printhead before setting the page finished flag (PhiPageFinish) in the PhiStatus register. 
     Printhead segments are divided into 2 groups, group A segments are 0, 2, 4, 6, 8, 10 and group B segments are 1, 3, 5, 7, 9, 11. For any printhead channel, group A segment data is transmitted first then group B. 
     Each time a line sync is received from the GPIO, the PHI sends a line of data and a fire (FIRE) command to all printhead segments. 
     The PHI first sends a next color command (NC_A) for the first half color nozzle row followed by nozzle data for the first half color dots. The number of dots transmitted (and accepted from the LLU) is configured by SegWidth register. The PHI then sends a next color command indicating to the printhead to reconfigure to accept the next color nozzle data. The PHI then sends the next half color dots. The process is repeated for MaxColor number of half nozzle rows. After all dots for a particular segment are transmitted, the PHI sends a next color B (NC_B) command to indicate to the group B printheads to prepare to accept nozzle row data. The command and data sequence is repeated as before. The line transmission to the printhead is completed with the transmission of a FIRE command. 
     The PHI can optionally insert a number of IDLE symbols before each next color command. The number of IDLE symbols inserted is configured by the IdleInsert register. If it&#39;s set to zero no symbols will be inserted. 
     When a line is complete, the PHI decrements the PageLenLine counter, and waits for the next line sync pulse from the GPIO before beginning the next line of data. 
     The PHI continues sending line data until the PageLenLine counter is 0 indicating the last line. When the last line is transmitted to the printhead segments, the PHI sets a page finished flag (PhiPageFinish) in the PhiStatus register. The PHI will then wait until the Go bit is toggled before sending the next page to the printhead. 
     Before starting printing SoPEC must configure the printhead segments. If there is more than one printhead segment on a printline, the printhead segments must be assigned a unique ID per print line. The IDs are assigned by holding one group of segments in reset while the other group is programmed by a CPU command stream issued through the PHI. The PHI does not directly control the printhead reset lines. They are connected to CPR block output pins and are controlled by the CPU through the CPR. 
     The printhead also provides a mechanism for reading data back from each individual printhead segment. All printhead segments use a common data back channel, so only one printhead segment can send data at a time. SoPEC issues a CPU command stream directed at a particular printhead segment, which causes the segment to return data on the back channel. The back channel is connected to a GPIO input, and is sampled by the CPU through the GPIO. 
     If SoPEC is being used in a multi-SoPEC printing system, it is possible that not all print channels, or clock outputs are being used. Any unused data outputs can be disabled by programming the PhiDataEnable register, or unused clock outputs disabled by programming the PhiClkEnable. 
     The CPU when enabling or disabling the clock or data outputs must ensure that the printhead segments they are connected to are held in a benign state while toggling the enable status of the output pins. 
     The PHI calculates the fire period needed in the printhead segments based on the last line sync period, adjusted by a fractional amount. The fractional factor is dependant on the way the columns in the printhead are grouped, the particular clock used within the printhead to count this period and the proportion of a line time over which the nozzles for that line must be fired. For example, one current plan has fire groups consisting of 32 nozzle columns which are physically located in a way that require them to be fired over a period of around 96% of the line time. A count is needed to indicate a period of (linetime/32)*96% for a 144 MHz clock. 
     The fractional amount the fire period is adjusted by is configured by the FireScaleNum register. The scale factor is the ratio of the configurable FireScaleNum numerator register and a fixed denominator of 0x10000. Note that the fire period is calculated in the pclk domain, but is used in the phiclk domain. The fractional registers will need to be programmed to take account of the ratio of the pclk and phiclk frequencies. 
     A new fire period is calculated with every new line sync pulse from the GPIO, regardless of whether the line sync pulse results in a new line of data being send to the printhead segments, or the line sync pending level. The latest calculated fire period by can read by accessing the FirePeriodCalc register. 
     The PHI transfers the last calculated fire period value (FirePeriodCalc) to the FirePeriod register immediately before the FIRE command is sent to the printhead. This prevents the FirePeriod value getting updated during the transfer of a FIRE command to the printhead, possibly sending an incorrect fire period value to the printhead. 
     The PHI can optionally send the calculated fire period by placing META character symbols in a command stream (either a CPU command, or a command configured in the command table). The META symbols are detected by the PHI and replaced with the calculated fire period. Currently 2 META characters are defined. 
     The last calculated fire period can be accessed by reading the FirePeriod register. 
     Immediately after the PHI leaves its reset it will start sending IDLE commands to all printhead data channels. The PHI will not accept any data from the LLU until the Go bit is set. Note the command table can be programmed at any time but cannot be used by the internal PHY when Go is 0. 
     When Go is set to 1 the PHI will accept data from the LLU. When data actually arrives in the data buffer the PHI will set the PhiDataReady bit in the PhiStatus register. The PHI will not start sending data to the printhead until it receives 2 line syncs from the GPIO (gpio_phi_line_sync). The PHI needs to wait for 2 line syncs to allow it to calculate the fire period value. The first line sync will not become pending, and will not result in a corresponding FIRE command. Note that the PHI does not need to wait for data from the LLU before it can calculate the fire period. If the PHI is waiting for data from the LLU any line syncs it receives from the GPIO (except the first one) will become pending. 
     Once data is available and the fire period is calculated the PHI will start producing print streams. For each line transmitted the PHI will wait for a line sync pulse (or the minimum line time if a line sync is pending) before sending the next line of data to the printheads. The PHI continues until a full page of data has been transmitted to the printhead (as specified by the PageLenLine register). When the page is complete the PHI will automatically clear the Go bit and will set the PhiPageFinish flag in the PhiStatus register. Any bit in the PhiStatus register can be used to generate an interrupt to the ICU. 
     The bi-lithic printhead (as distinct from the linking printhead) is now described from the point of view of printing 30 ppm from a SoPEC ASIC, as well as architectures that solve the 60 ppm printing requirement using the bi-lithic printhead model. 
     To print at 30 ppm, the printheads must print a single page within 2 seconds. This would include the time taken to print the page itself plus any inter-page gap (so that the 30 ppm target could be met). The required printing rate assumes an inter-sheet spacing of 4 cm. 
     A baseline SoPEC system connecting to two printhead segments is shown in  FIG. 39 . The two segments (A and B) combine to form a printhead of typical width 13,824 nozzles per color. 
     We assume decoupling of data generation, transmission to the printhead, and firing. 
     A single SoPEC produces the data for both printheads for the entire page. Therefore it has the entire line time in which to generate the dot data. 
     A Letter page is 11 inches high. Assuming 1600 dpi and a 4 cm inter-page gap, there are 20,120 lines. This is a line rate of 10.06 KHz (a line time of 99.4 us). 
     The printhead is 14,080 dots wide. To calculate these dots within the line time, SoPEC requires a 140.8 MHz dot generation rate. Since SoPEC is run at 160 MHz and generates 1 dot per cycle, it is able to meet the Letter page requirement and cope with a small amount of stalling during the dot generation process. 
     An A4 page is 297 mm high. Assuming 62.5 dots/mm and a 4 cm inter-page gap, there are 21,063 lines. This is a line rate of 10.54 KHz (a line time of 94.8 us). 
     The printhead is 14,080 dots wide. To calculate these dots within the line time, SoPEC requires a 148.5 MHz dot generation rate. Since SoPEC is run at 160 MHz and generates 1 dot per cycle, it is able to meet the A4 page requirement and cope with minimal stalling. 
     Assuming an n-color printhead, SoPEC must transmit 14,080 dots □ n-bits within the line time. i.e. n □ the data generation rate=n-bits □ 14,080 dots □ 10.54 KHz. Thus a 6-color printhead requires 874.2 Mb/sec. 
     The transmission time is further constrained by the fact that no data must be transmitted to the printhead segments during a window around the linesync pulse. Assuming a 1% overhead for linesync overhead (being very conservative), the required transmission bandwidth for 6 colors is 883 Mb/sec. 
     However, the data is transferred to both segments simultaneously. This means the longest time to transfer data for a line is determined by the time to transfer print data to the longest print segment. There are 9744 nozzles per color across a type7 printhead. We therefore must be capable of transmitting 6-bits □ 9744 dots at the line rate i.e. 6-bits □ 9744 □ 10.54 KHz=616.2 Mb/sec. Again, assuming a 1% overhead for linesync overhead, the required transmission bandwidth to each printhead is 622.4 Mb/sec. 
     The connections from SoPEC to each segment consist of 2 □ 1-bit data lines that operate at 320 MHz each. This gives a total of 640 Mb/sec. 
     Therefore the dot data can be transmitted at the appropriate rate to the printhead to meet the 30 ppm requirement. 
     The dot data is accepted by the printhead at 2-bits per cycle at 320 MHz. 6 bits are available after 3 cycles at 320 MHz, and these 6-bits are then clocked into the shift registers within the printhead at a rate of 106 MHz. 
     Thus the data movement within the printhead shift registers is able to keep up with the rate at which data arrives in the printhead. 
     The issues introduced by printing at 60 ppm are now described, with the cases of 4, 5, and 6 colors in the printhead. The arrangement is shown in  FIG. 40 . 
     A 60 ppm printer is 1 page per second. i.e
         A4=21,063 lines. This is a line rate of 21.06 KHz (a line time of 47.4 us)   Letter=20,120 lines. This is a line rate of 20.12 KHz (a line time of 49.7 us)       

     If each SoPEC is responsible for generating the data for its specific printhead, then the worst case for dot generation is the largest printhead. 
     Since the preferred embodiment of SoPEC is run at 160 MHz, it is only able to meet the dot requirement rate for the 5:5 printhead, and not the 6:4 or 7:3 printheads. 
     Each SoPEC must transmit a printhead&#39;s worth of bits per color to the printhead per line. The transmission time is further constrained by the fact that no data must be transmitted to the printhead segments during a window around the linesync pulse. Assuming that the line sync overhead is constant regardless of print speed, then a 1% overhead at 30 ppm translates into a 2% overhead at 60 ppm. 
     Since we have 2 lines to the printhead operating at 320 MHz each, the total bandwidth available is 640 Mb/sec. The existing connection to the printhead will only deliver data to a 4-color 5:5 arrangement printhead fast enough for 60 ppm. The connection speed in the preferred embodiment is not fast enough to support any other printhead or color configuration. 
     The dot data is currently accepted by the printhead at 2-bits per cycle at 320 MHz. Although the connection rate is only fast enough for 4 color 5:5 printing, the data must still be moved around in the shift registers once received. 
     The 5:5 printer 4-color dot data is accepted by the printhead at 2-bits per cycle at 320 MHz. 4 bits are available after 2 cycles at 320 MHz, and these 4-bits would then need to be clocked into the shift registers within the printhead at a rate of 160 MHz. 
     Since the 6:4 and 7:3 printhead configuration schemes require additional bandwidth etc., the printhead needs some change to support these additional forms of 60 ppm printing. 
     Given the problems described above, the following issues have been addressed for 60 ppm printing based on the earlier SoPEC architecture:
         rate of data generation   transmission to the printhead   shift register setup within the printhead.       

     Assuming the current bi-lithic printhead, there are 3 basic classes of solutions to allow 60 ppm: 
     a. Each SoPEC generates dot data and transmits that data to a single printhead connection, as shown in  FIG. 41 . 
     b. One SoPEC generates data and transmits to the smaller printhead, but both SoPECs generate and transmit directly to the larger printhead, as shown in  FIG. 42 . 
     c. Same as (b) except that SoPEC A only transmits to printhead B via SoPEC B (i.e. instead of directly), as shown in  FIG. 43 . 
     This solution class is where each SoPEC generates dot data and transmits that data to a single printhead connection, as shown in  FIG. 41 . The existing SoPEC architecture is targeted at this class of solution. 
     To achieve 60 ppm using the same basic architecture as currently implemented, the following needs to occur:
         Increase effective dot generation rate to 206 MHz   Increase bandwidth to printhead to 1256 Mb/sec   Increase bandwidth of printhead shift registers to match transmission bandwidth       

     It should be noted that even when all these speed improvements are implemented, one SoPEC will still be producing 40% more dots than it would be under a 5:5 scheme. i.e. this class of solution is not load balanced. 
     In a scenario of connecting the printheads together to appear logically as a 5:5, each SoPEC generates data as if for a 5:5 printhead, and the printhead, even though it is physically a 5:5, 6:4 or 7:3 printhead, maintains a logical appearance of a 5:5 printhead. 
     There are a number of means of accomplishing this logical appearance, but they all rely on the two printheads being connected in some way, as shown in  FIG. 42 . 
     In this embodiment, the dot generation rate no longer needs to be addressed as only the 5:5 dot generation rate is required, and the current speed of 160 MHz is sufficient. 
     One SoPEC can generate data and transmit to the smaller printhead, but both SoPECs generate and transmit directly to the larger printhead, as shown in  FIG. 43 . i.e. SoPEC A transmits to printheads A and B, while SoPEC B transmits only to printhead B. The intention is to allow each SoPEC to generate the dot data for a type 5 printhead, and thereby to balance the dot generation load. 
     Since the connections between SoPEC and printhead are point-to-point, it requires a doubling of printhead connections on the larger printhead (one connection set goes to SoPEC A and the other goes to SoPEC B). 
     Two connections on the printhead can be connected to the same shift register to form a serial load. Thus the shift register can be driven by either SoPEC, as shown in  FIG. 44 . 
     The 2 SoPECs take turns (under synchronisation) in transmitting on their individual lines as follows:
         SoPEC B transmits even (or odd) data for 5 segments   SoPEC A transmits data for 5-printhead A segments even and odd   SoPEC B transmits the odd (or even) data for 5 segments.       

     Meanwhile SoPEC A is transmitting the data for printhead A, which will be length  3 ,  4 , or  5 . 
     Note that SoPEC A is transmitting as if to a printhead combination of N:5-N, which means that the dot generation pathway (other than synchronization) is already as defined. 
     Although the dot generation problem is resolved by this scenario (each SoPEC generates data for half the page width and therefore it is load balanced), the transmission speed for each connection must be sufficient to deliver to a type7 printhead i.e. 1256 Mb/sec. In addition, the bandwidth of the printhead shift registers must be altered to match the transmission bandwidth. 
     The two connections on the printhead can be connected to different shift registers to form a parallel load, as shown in  FIG. 45 . Thus the two SoPECs can write to the printhead in parallel. Note that SoPEC A is transmitting as if to a printhead combination of N:5-N, which means that the dot generation pathway is already as defined. 
     The dot generation problem is resolved by this scenario since each SoPEC generates data for half the page width and therefore it is load balanced. 
     Since the connections operate in parallel, the transmission speed required is that required to address 5:5 printing, i.e. 891 Mb/sec. In addition, the bandwidth of the printhead shift registers must be altered to match the transmission bandwidth. 
     SoPEC A may only transmit to printhead B via SoPEC B (i.e. instead of directly), as shown in  FIG. 46  i.e. SoPEC A transmits directly to printhead A and indirectly to printhead B via SoPEC B, while SoPEC B transmits only to printhead B. 
     This class of architecture has the attraction that a printhead is driven by a single SoPEC, which minimizes the number of pins on a printhead. However it requires receiver connections on SoPEC B. It becomes particularly practical (costwise) if those receivers are currently unused (i.e. they would have been used for transmitting to the second printhead in a single SoPEC system). Of course this assumes that the pins are not being used to achieve the higher bandwidth. 
     Although the dot generation problem is resolved by this scenario (each SoPEC generates data for half the page width and therefore it is load balanced), the transmission speed for each connection must be sufficient to deliver to a type7 printhead i.e. 1256 Mb/sec. In addition, the bandwidth of the printhead shift registers must be altered to match the transmission bandwidth. 
     If SoPEC B provides at least a line buffer for the data received from SoPEC A, then the transmission between SoPEC A and printhead A is decoupled, and although the bandwidth from SoPEC B to printhead B must be 1256 Mb/sec, the bandwidth between the two SoPECs can be lower i.e. enough to transmit 2 segments worth of data (359 Mb/sec). 
     Architecture A has the problem that no matter what the increase in speed, the solution is not load balanced, leaving architecture B or C the more preferred solution where load-balancing between SoPEC chips is desirable or necessary. The main advantage of an architecture A style solution is that it reduces the number of connections on the printhead. 
     All architectures require the increase in bandwidth to the printhead, and a change to the internal shift register structure of the printhead. 
     Other architectures can be used where different printhead modules are used. For example, in one embodiment, the dot data is provided from a single printed controller (SoPEC) via multiple serial links to a printhead. Preferably, the links in this embodiment each carry dot data for more than one channel (color, etc) of the printhead. For example, one link can carry CMY dot data from the printer controller and the other channel can carry K, IR and fixative channels. 
     60 ppm printing using bi-lithic printheads is risky due to increased CPU requirements, increased numbers of pins, and the high data rates at which the transmission occurs. It also relies on stitching working correctly on the printheads to allow the creation of long printheads over several reticles. 
     Therefore an alternative to 60 ppm printing via bi-lithic printheads should be found. 
     The basic idea of the linking printhead is that we create a printhead from tiles each of which can be fully formed within the reticle. The printheads are linked together as shown in  FIG. 50  to form the page-width printhead. For example, an A4/Letter page is assembled from 11 tiles. 
     The printhead is assembled by linking or butting up tiles next to each other. The physical process used for linking means that wide-format printheads are not readily fabricated (unlike the 21 mm tile). However printers up to around A3 portrait width (12 inches) are expected to be possible. 
     The nozzles within a single segment are grouped physically to reduce ink supply complexity and wiring complexity. They are also grouped logically to minimize power consumption and to enable a variety of printing speeds, thereby allowing speed/power consumption trade-offs to be made in different product configurations. 
     Each printhead segment contains a constant number of nozzles per color (currently 1280), divided into half (640) even dots and half (640) odd dots. If all of the nozzles for a single color were fired at simultaneously, the even and odd dots would be printed on different dot-rows of the page such that the spatial difference between any even/odd dot-pair is an exact number of dot lines. In addition, the distance between a dot from one color and the corresponding dot from the next color is also an exact number of dot lines. 
     The exact distance between even and odd nozzle rows, and between colors will vary between embodiments, so it is preferred that these relationships be programmable with respect to SoPEC. 
     When 11 segments are joined together to create a 30 ppm printhead, a single SoPEC will connect to them as shown in  FIG. 51 . 
     Notice that each phDataOutn lvds pair goes to two adjacent printhead segments, and that each phClkn signal goes to 5 or 6 printhead segments. Each phRstn signal goes to alternate printhead segments. 
     SoPEC drives phRst 0  and phRst 1  to put all the segments into reset. 
     SoPEC then lets phRst 1  come out of reset, which means that all the segment  1 ,  3 ,  5 ,  7 , and  9  are now alive and are capable of receiving commands. 
     SoPEC can then communicate with segment  1  by sending commands down phDataOut 0 , and program the segment  1  to be id  1 . It can communicate with segment  3  by sending commands down phDataOut 1 , and program segment  3  to be id  1 . This process is repeated until all segments  1 ,  3 ,  5 ,  7 , and  9  are assigned ids of 1. The id only needs to be unique per segment addressed by a given phDataOutn line. 
     SoPEC can then let phRst 0  come out of reset, which means that segments  0 ,  2 ,  4 ,  6 ,  8 , and  10  are all alive and are capable of receiving commands. The default id after reset is 0, so now each of the segments is capable of receiving commands along the same pDataOutn line. 
     SoPEC needs to be able to send commands to individual printheads, and it does so by writing to particular registers at particular addresses. 
     The exact relationship between id and register address etc. is yet to be determined, but at the very least it will involve the CPU being capable of telling the PHI to send a command byte sequence down a particular phDataOutn line. 
     One possibility is that one register contains the id (possibly 2 bits of id). Further, a command may consist of:
         register write   register address   data       

     A 10-bit wide fifo can be used for commands in the PHI. 
     When 11 segments are joined together to create a 60 ppm printhead, the 2 SoPECs will connect to them as shown in  FIG. 52 . 
     In the 60 ppm case only phClk 0  and phRst 0  are used (phClk 1  and phRst 1  are not required). However note that lineSync is required instead. It is possible therefore to reuse phRst 1  as a lineSync signal for multi-SoPEC synchronisation. It is not possible to reuse the pins from phClk 1  as they are lvds. It should be possible to disable the lvds pads of phClk 1  on both SoPECs and phDataOut 5  on SoPEC B and therefore save a small amount of power. 
     Various classes of printhead that can be used are now described. With the exception of the PEC1 style slope printhead, SoPEC is designed to be capable of working with each of these printhead types at full 60 ppm printing speed. 
     The A-chip/A-chip printhead style consists of identical printhead tiles (type A) assembled in such a way that rows of nozzles between 2 adjacent chips have no vertical misalignment. 
     The most ideal format for this kind of printhead from a data delivery point of view is a rectangular join between two adjacent printheads, as shown in  FIG. 53 . However due to the requirement for dots to be overlapping, a rectangular join results in a it results in a vertical stripe of white down the join section since no nozzle can be in this join region. A white stripe is not acceptable, and therefore this join type is not acceptable. 
       FIG. 54  shows a sloping join similar to that described for the bi-lithic printhead chip, and  FIG. 55  is a zoom in of a single color component, illustrating the way in which there is no visible join from a printing point of view (i.e. the problem seen in  FIG. 53  has been solved). 
     The A-chip/A-chip setup described above requires perfect vertical alignment. Due to a variety of factors (including ink sealing) it may not be possible to have perfect vertical alignment. To create more space between the nozzles, A-chips can be joined with a growing vertical offset, as shown in  FIG. 56 . 
     The growing offset comes from the vertical offset between two adjacent tiles. This offset increases with each join. For example, if the offset were 7 lines per join, then an 11 segment printhead would have a total of 10 joins, and 70 lines. 
     To supply print data to the printhead for a growing offset arrangement, the print data for the relevant lines must be present. A simplistic solution of simply holding the entire line of data for each additional line required leads to increased line store requirements. For example, an 11 segment×1280-dot printhead requires an additional 11×1280-dots×6-colors per line i.e. 10.3125 Kbytes per line. 70 lines requires 722 Kbytes of additional storage. Considering SoPEC contains only 2.5 MB total storage, an additional 722 Kbytes just for the offset component is not desirable. Smarter solutions require storage of smaller parts of the line, but the net effect is the same: increased storage requirements to cope with the growing vertical offset. 
     The problem of a growing offset described above is that a number of additional lines of storage need to be kept, and this number increases proportional to the number of joins i.e. the longer the printhead the more lines of storage are required. 
     However, we can place each chip on a mild slope to achieve a constant number of printlines regardless of the number of joins. The arrangement is similar to that used in PEC1, where the printheads are sloping. The difference here is that each printhead is only mildly sloping, for example so that the total number of lines gained over the length of the printhead is 7. The next printhead can then be placed offset from the first, but this offset would be from the same base. i.e. a printhead line of nozzles starts addressing line n, but moves to different lines such that by the end of the line of nozzles, the dots are 7 dotlines distant from the startline. This means that the 7-line offset required by a growing-offset printhead can be accommodated. 
     The arrangement is shown in  FIG. 57 . 
     If the offset were 7 rows, then a total of 72.2 KBytes are required to hold the extra rows, which is a considerable saving over the 722 Kbytes required above. 
     Note also, that in this example, the printhead segments are vertically aligned (as in PEC1). It may be that the slope can only be a particular amount, and that growing offset compensates for additional differences—i.e. the segments could in theory be misaligned vertically. In general SoPEC must be able to cope with vertically misaligned printhead segments. 
     The question then arises as to how much slope must be compensated for at 60 ppm speed. Basically—as much as can comfortably handled without too much logic. However, amounts like 1 in 256 (i.e. 1 in 128 with respect to a half color), or 1 in 128 (i.e. 1 in 64 with respect to a half color) must be possible. Greater slopes and weirder slopes (e.g. 1 in 129 with respect to a half color) must be possible, but with a sacrifice of speed i.e. SoPEC must be capable even if it is a slower print. 
     Note also that the nozzles are aligned, but the chip is placed sloped. This means that when horizontal lines are attempted to be printed and if all nozzles were fired at once, the effect would be lots of sloped lines. However, if the nozzles are fired in the correct order relative to the paper movement, the result is a straight line for n dots, then another straight line for n dots 1 line up. 
     The PEC1 style slope is the physical arrangement used by printhead segments addressed by PEC1. Note that SoPEC is not expected to work at 60 ppm speed with printheads connected in this way. However it is expected to work and is shown here for completeness, and if tests should prove that there is no working alternative to the 21 mm tile, then SoPEC will require significant reworking to accommodate this arrangement at 60 ppm. 
     In this scheme, the segments are joined together by being placed on an angle such that the segments fit under each other, as shown in  FIG. 58 . The exact angle will depend on the width of the Memjet segment and the amount of overlap desired, but the vertical height is expected to be in the order of 1 mm, which equates to 64 dot lines at 1600 dpi. 
       FIG. 59  shows more detail of a single segment in a multi-segment configuration, considering only a single row of nozzles for a single color plane. Each of the segments can be considered to produce dots for multiple sets of lines. The leftmost d nozzles (d depends on the angle that the segment is placed at) produce dots for line n, the next d nozzles produce dots for line n−1, and so on. 
     A-chip/A-chip with inter line compensation is effectively the same as described above except that the nozzles are physically arranged inside the printhead to compensate for the nozzle firing order given the desire to spread the power across the printhead. This means that one nozzle and its neighbor can be vertically separated on the printhead by 1 printline. i.e. the nozzles don&#39;t line up across the printhead. This means a jagged effect on printed “horizontal lines” is avoided, while achieving the goal of averaging the power. 
     The arrangement of printheads is the same as that shown in  FIG. 57 . However the actual nozzles are slightly differently arranged, as illustrated via magnification in  FIG. 60 . 
     Another possibility is to have two kinds of printing chips: an A-type and a B-type. The two types of chips have different shapes, but can be joined together to form long printheads. A parallelogram is formed when the A-type and B-type are joined. 
     The two types are joined together as shown in  FIG. 61 . 
     Note that this is not a growing offset. The segments of a multiple-segment printhead have alternating fixed vertical offset from a common point, as shown in  FIG. 62 . 
     If the vertical offset from a type-A to a type-B printhead were n lines, the entire printhead regardless of length would have a total of n lines additionally required in the line store. This is certainly a better proposition than a growing offset). 
     However there are many issues associated with an A-chip/B-chip printhead. Firstly, there are two different chips i.e. an A-chip, and a B-chip. This means 2 masks, 2 developments, verification, and different handling, sources etc. It also means that the shape of the joins are different for each printhead segment, and this can also imply different numbers of nozzles in each printhead. Generally this is not a good option. 
     The general linking concept illustrated in the A-chip/B-chip can be incorporated into a single printhead chip that contains the A-B join within the single chip type. 
     This kind of joining mechanism is referred to as the A-B chip since it is a single chip with A and B characteristics. The two types are joined together as shown in  FIG. 63 . 
     This has the advantage of the single chip for manipulation purposes. 
     SoPEC must compensate for the vertical misalignment within the printhead. The amount of misalignment is the amount of additional line storage required. 
     Note that this kind of printhead can effectively be considered similar to the mildly sloping printhead described above except that the step at the discontinuity is likely to be many lines vertically (on the order of 7 or so) rather than the 1 line that a gentle slope would generate. 
     The A-B chip with printhead compensation kind of printhead is where we push the A-B chip discontinuity as far along the printhead segment as possible—right to the edge. This maximises the A part of the chip, and minimizes the B part of the chip. If the B part is small enough, then the compensation for vertical misalignment can be incorporated on the printhead, and therefore the printhead appears to SoPEC as if it was a single typeA chip. This only makes sense if the B part is minimized since printhead real-estate is more expensive at 0.35 microns rather than on SoPEC at 0.18 microns. 
     The arrangement is shown in  FIG. 64 . 
     Note that since the compensation is accomplished on the printhead, the direction of paper movement is fixed with respect to the printhead. This is because the printhead is keeping a history of the data to apply at a later time and is only required to keep the small amount of data from the B part of the printhead rather than the A part. 
     Within reason, some of the various linking methods can be combined. For example, we may have a mild slope of 5 over the printhead, plus an on-chip compensation for a further 2 lines for a total of 7 lines between type A chips. The mild slope of 5 allows for a 1 in 128 per half color (a reasonable bandwidth increase), and the remaining 2 lines are compensated for in the printheads so do not impact bandwidth at all. 
     However we can assume that some combinations make less sense. For example, we do not expect to see an A-B chip with a mild slope. 
     A linking printhead is constructed from linking printhead ICs, placed on a substrate containing ink supply holes. An A4 pagewidth printer used 11 linking printhead ICs. Each printhead is placed on the substrate with reference to positioning fidicuals on the substrate. 
       FIG. 65  shows the arrangement of the printhead ICs (also known as segments) on a printhead. The join between two ICs is shown in detail. The left-most nozzles on each row are dropped by 10 line-pitches, to allow continuous printing across the join.  FIG. 65  also introduces some naming and co-ordinate conventions used throughout this document. 
       FIG. 65  shows the anticipated first generation linking printhead nozzle arrangements, with 10 nozzle rows supporting five colours. The SoPEC compensation mechanisms are general enough to cover other nozzle arrangements. 
     Printheads ICs may be misplaced relative to their ideal position. This misplacement may include any combination of:
         x offset   y offset   yaw (rotation around z)   pitch (rotation around y)   roll (rotation around z)       

     In some cases, the best visual results are achieved by considering relative misplacement between adjacent ICs, rather than absolute misplacement from the substrate. There are some practical limits to misplacement, in that a gross misplacement will stop the ink from flowing through the substrate to the ink channels on the chip. 
     Correcting for misplacement obviously requires the misplacement to be measured. In general this may be achieved directly by inspection of the printhead after assembly, or indirectly by scanning or examining a printed test pattern. 
     SoPEC can compensate for misplacement of linking chips in the X-direction, but only snapped to the nearest dot. That is, a misplacement error of less than 0.5 dot-pitches or 7.9375 microns is not compensated for, a misplacement more that 0.5 dot-pitches but less than 1.5 dot-pitches is treated as a misplacement of 1 dot-pitch, etc. 
     Uncompensated X misplacement can result in three effects:
         printed dots shifted from their correct position for the entire misplaced segment   missing dots in the overlap region between segments.   duplicated dots in the overlap region between segments.       

     SoPEC can correct for each of these three effects. 
     In preparing line data to be printed, SoPEC buffers in memory the dot data for a number of lines of the image to be printed. Compensation for misplacement generally involves changing the pattern in which this dot data is passed to the printhead ICs. 
     SoPEC uses separate buffers for the even and odd dots of each colour on each line, since they are printed by different printhead rows. So SoPEC&#39;s view of a line at this stage is as (up to) 12 rows of dots, rather than (up to) 6 colours. Nominally, the even dots for a line are printed by the lower of the two rows for that colour on the printhead, and the odd dots are printed by the upper row (see  FIG. 65 ). For the current linking printhead IC, there are 640 nozzles in row. Each row buffer for the full printhead would contain 640×11 dots per line to be printed, plus some padding if required. 
     In preparing the image, SoPEC can be programmed in the DWU module to precompensate for the fact that each row on the printhead IC is shifted left with respect to the row above. In this way the leftmost dot printed by each row for a colour is the same offset from the start of a row buffer. In fact the programming can support arbitrary shapes for the printhead IC. 
     SoPEC has independent registers in the LLU module for each segment that determine which dot of the prepared image is sent to the left-most nozzle of that segment. Up to 12 segments are supported. With no misplacement, SoPEC could be programmed to pass dots  0  to  639  in a row to segment  0 , dots  640  to  1279  in a row to segment  1 , etc. 
     If segment  1  was misplaced by 2 dot-pitches to the right, SoPEC could be adjusted to pass to dots  641  to  1280  of each row to segment  1  (remembering that each row of data consists entirely of either odd dots or even dots from a line, and that dot  1  on a row is printed two dot positions away from dot  0 ). This means the dots are printed in the correct position overall. This adjustment is based on the absolute placement of each printhead IC. Dot  640  is not printed at all, since there is no nozzle in that position on the printhead. 
     A misplacement of an odd number of dot-pitches is more problematic, because it means that the odd dots from the line now need to be printed by the lower row of a colour pair, and the even dots by the upper row of a colour pair on the printhead segment. Further, swapping the odd and even buffers interferes with the precompensation. This results in the position of the first dot to be sent to a segment being different for odd and even rows of the segment. SoPEC addresses this by having independent registers in the LLU to specify the first dot for the odd and even rows of each segment, i.e. 2×12 registers. A further register bit determines whether dot data for odd and even rows should be swapped on a segment by segment basis. 
       FIG. 66  shows the detailed alignment of dots at the join between two printhead ICs, for various cases of misplacement, for a single colour. 
     The effects at the join depend on the relative misplacement of the two segments. In the ideal case with no misplacement, the last 3 nozzles of upper row of the segment N interleave with the first three nozzles of the lower row of segment N+1, giving a single nozzle (and so a single printed dot) at each dot-pitch. 
     When segment N+1 is misplaced to the right relative to segment N (a positive relative offset in X), there are some dot positions without a nozzle, i.e. missing dots. For positive offsets of an odd number of dot-pitches, there may also be some dot positions with two nozzles, i.e. duplicated dots. Negative relative offsets in X of segment N+1 with respect to segment N are less likely, since they would usually result in a collision of the printhead ICs, however they are possible in combination with an offset in Y. A negative offset will always cause duplicated dots, and will cause missing dots in some cases. Note that the placement and tolerances can be deliberately skewed to the right in the manufacturing step to avoid negative offsets. 
     Where two nozzles occupy the same dot position, the corrections described above will result in SoPEC reading the same dot data from the row buffer for both nozzles. To avoid printing this data twice SoPEC has two registers per segment in the LLU that specify a number (up to 3) of dots to suppress at the start of each row, one register applying to even dot rows, one to odd dot rows. 
     SoPEC compensates for missing dots by add the missing nozzle position to its dead nozzle map. This tells the dead nozzle compensation logic in the DNC module to distribute the data from that position into the surrounding nozzles, before preparing the row buffers to be printed. 
     SoPEC can compensate for misplacement of printhead ICs in the Y-direction, but only snapped to the nearest 0.1 of a line. Assuming a line-pitch of 15.875 microns, if an IC is misplaced in Y by 0 microns, SoPEC can print perfectly in Y. If an IC is misplaced by 1.5875 microns in Y, then we can print perfectly. If an IC is misplaced in Y by 3.175 microns, we can print perfectly. But if an IC is misplaced by 3 microns, this is recorded as a misplacement of 3.175 microns (snapping to the nearest 0.1 of a line), and resulting in a Y error of 0.175 microns (most likely an imperceptible error). 
     Uncompensated Y misplacement results in all the dots for the misplaced segment being printed in the wrong position on the page. 
     SoPEC&#39;s compensation for Y misplacement uses two mechanism, one to address whole line-pitch misplacement, and another to address fractional line-pitch misplacement. These mechanisms can be applied together, to compensate for arbitrary misplacements to the nearest 0.1 of a line. 
     The buffers used to hold dot data to be printed for each row contain dot data for multiple lines of the image to be printed. Due to the physical separation of nozzle rows on a printhead IC, at any time different rows are printing data from different lines of the image. 
     For a printhead on which all ICs are ideally placed, row  0  of each segment is printing data from the line N of the image, row  1  of each segment is printing data from row N-M of the image etc. where N is the separation of rows  0  and  1  on the printhead. Separate SoPEC registers in the LLU for each row specify the designed row separations on the printhead, so that SoPEC keeps track of the “current” image line being printed by each row. 
     If one segment is misplaced by one whole line-pitch, SoPEC can compensate by adjusting the line of the image being sent to each row of that segment. This is achieved by adding an extra offset on the row buffer address used for that segment, for each row buffer. This offset causes SoPEC to provide the dot data to each row of that segment from one line further ahead in the image than the dot data provided to the same row on the other segments. For example, when the correctly placed segments are printing line N of an image with row  0 , line N-M of the image with row  1 , etc, then the misplaced segment is printing line N+1 of the image with row  0 , line N-M+1 of the image with row  1 , etc. 
     SoPEC has one register per segment to specify this whole line-pitch offset. The offset can be multiple line-pitches, compensating for multiple lines of misplacement. Note that the offset can only be in the forward direction, corresponding to a negative Y offset. This means the initial setup of SoPEC must be based on the highest (most positive) Y-axis segment placement, and the offsets for other segments calculated from this baseline. Compensating for Y displacement requires extra lines of dot data buffering in SoPEC, equal to the maximum relative Y offset (in line-pitches) between any two segments on the printhead. For each misplaced segment, each line of misplacement requires approximately 640×10 or 6400 extra bits of memory. 
     Compensation for fractional line-pitch displacement of a segment is achieved by a combination of SoPEC and printhead IC fire logic. 
     The nozzle rows in the printhead are positioned by design with vertical spacings in line-pitches that have a integer and fractional component. The fractional components are expressed relative to row zero, and are always some multiple of 0.1 of a line-pitch. The rows are fired sequentially in a given order, and the fractional component of the row spacing matches the distance the paper will move between one row firing and the next.  FIG. 67  shows the row position and firing order on the current implementation of the printhead IC. Looking at the first two rows, the paper moves by 0.5 of a line-pitch between the row  0  (fired first) and row  1  (fired sixth). is supplied with dot data from a line 3 lines before the data supplied to row  0 . This data ends up on the paper exactly 3 line-pitches apart, as required. 
     If one printhead IC is vertically misplaced by a non-integer number of line-pitches, row  0  of that segment no longer aligns to row  0  of other segments. However, to the nearest 0.1 of a line, there is one row on the misplaced segment that is an integer number of line-pitches away from row  0  of the ideally placed segments. If this row is fired at the same time as row  0  of the other segments, and it is supplied with dot data from the correct line, then its dots will line up with the dots from row  0  of the other segments, to within a 0.1 of a line-pitch. Subsequent rows on the misplaced printhead can then be fired in their usual order, wrapping back to row  0  after row  9 . This firing order results in each row firing at the same time as the rows on the other printheads closest to an integer number of line-pitches away. 
       FIG. 68  shows an example, in which the misplaced segment is offset by 0.3 of a line-pitch. In this case, row  5  of the misplaced segment is exactly 24.0 line-pitches from row  0  of the ideal segment. Therefore row  5  is fired first on the misplaced segment, followed by row  7 ,  9 ,  0  etc. as shown. Each row is fired at the same time as the a row on the ideal segment that is an integer number of lines away. This selection of the start row of the firing sequence is controlled by a register in each printhead IC. 
     SoPEC&#39;s role in the compensation for fractional line-pitch misplacement is to supply the correct dot data for each row. Looking at  FIG. 68 , we can see that to print correct, row  5  on the misplaced printhead needs dot data from a line 24 lines earlier in the image than the data supplied to row  0 . On the ideal printhead, row  5  needs dot data from a line 23 lines earlier in the image than the data supplied to row  0 . In general, when a non-default start row is used for a segment, some rows for that segment need their data to be offset by one line, relative to the data they would receive for a default start row. SoPEC has a register in LLU for each row of each segment, that specifies whether to apply a one line offset when fetching data for that row of that segment. 
     The Roll (rotation around X) kind of erroneous rotational displacement means that all the nozzles will end up pointing further up the page in Y or further down the page in Y. The effect is the same as a Y misplacement, except there is a different Y effect for each media thickness (since the amount of misplacement depends on the distance the ink has to travel). 
     In some cases, it may be that the media thickness makes no effective visual difference to the outcome, and this form of misplacement can simply be incorporated into the Y misplacement compensation. If the media thickness does make a difference which can be characterised, then the Y misplacement programming can be adjusted for each print, based on the media thickness. It will be appreciated that correction for roll is particularly of interest where more than one printhead module is used to form a printhead, since it is the discontinuities between strips printed by adjacent modules that are most objectionable in this context. 
     In the pitch (rotation around Y) rotation, one end of the IC is further into the substrate than the other end. This means that the printing on the page will be dots further apart at the end that is further away from the media (i.e. less optical density), and dots will be closer together at the end that is closest to the media (more optical density) with a linear fade of the effect from one extreme to the other. Whether this produces any kind of visual artifact is unknown, but it is not compensated for in SoPEC. 
     The yaw (rotation around Z) kind of erroneous rotational displacement means that the nozzles at one end of a IC will print further down the page in Y than the other end of the IC. There may also be a slight increase in optical density depending on the rotation amount. 
     SoPEC can compensate for this by providing first order continuity, although not second order continuity in the preferred embodiment. First order continuity (in which the Y position of adjacent line ends is matched) is achieved using the Y offset compensation mechanism, but considering relative rather than absolute misplacement. Second order continuity (in which the slope of the lines in adjacent print modules is at least partially equalised) can be effected by applying a Y offset compensation on a per pixel basis. Whilst one skilled in the art will have little difficulty deriving the timing difference that enables such compensation, SoPEC does not compensate for it and so it is not described here in detail. 
       FIG. 69  shows an example where printhead IC number  4  is be placed with yaw, is shown in  FIG. 69 , while all other ICs on the printhead are perfectly placed. The effect of yaw is that the left end of segment  4  of the printhead has an apparent Y offset of −1 line-pitch relative to segment  3 , while the right end of segment  4  has an apparent Y offset of 1 line-pitch relative to segment  5 . 
     To provide first-order continuity in this example, the registers on SoPEC would be programmed such that segments  0  to  3  have a Y offset of 0, segment  4  has a Y offset of −1, and segments  5  and above have Y offset of −2. Note that the Y offsets accumulate in this example—even though segment  5  is perfect aligned to segment  3 , they have different Y offsets programmed. 
     It will be appreciated that some compensation is better than none, and it is not necessary in all cases to perfectly correct for roll and/or yaw. Partial compensation may be adequate depending upon the particular application. As with roll, yaw correction is particularly applicable to multi-module printheads, but can also be applied in single module printheads. 
     The printhead will be designed for 5 colors. At present the intended use is:
         cyan   magenta   yellow   black   infra-red       

     However the design methodology must be capable of targeting a number other than 5 should the actual number of colors change. If it does change, it would be to 6 (with fixative being added) or to 4 (with infra-red being dropped). 
     The printhead chip does not assume any particular ordering of the 5 colour channels. 
     The printhead will contain 1280 nozzles of each color—640 nozzles on one row firing even dots, and 640 nozzles on another row firing odd dots. This means 11 linking printheads are required to assemble an A4/Letter printhead. 
     However the design methodology must be capable of targeting a number other than 1280 should the actual number of nozzles per color change. Any different length may need to be a multiple of 32 or 64 to allow for ink channel routing. 
     The printhead will target true 1600 dpi printing. This means ink drops must land on the page separated by a distance of 15.875 microns. 
     The 15.875 micron inter-dot distance coupled with mems requirements mean that the horizontal distance between two adjacent nozzles on a single row (e.g. firing even dots) will be 31.75 microns. 
     All 640 dots in an odd or even colour row are exactly aligned vertically. Rows are fired sequentially, so a complete row is fired in small fraction (nominally one tenth) of a line time, with individual nozzle firing distributed within this row time. As a result dots can end up on the paper with a vertical misplacement of up to one tenth of the dot pitch. This is considered acceptable. 
     The vertical distance between rows is adjusted based on the row firing order. Firing can start with any row, and then follows a fixed rotation.  FIG. 70  shows the default row firing order from 1 to 10, starting at the top even row. Rows are separated by an exact number of dot lines, plus a fraction of a dot line corresponding to the distance the paper will move between row firing times. This allows exact dot-on-dot printing for each colour. The starting row can be varied to correct for vertical misalignment between chips, to the nearest 0.1 pixels. SoPEC appropriate delays each row&#39;s data to allow for the spacing and firing order 
     An additional constraint is that the odd and even rows for given colour must be placed close enough together to allow them to share an ink channel. This results in the vertical spacing shown in  FIG. 70 , where L represents one dot pitch. 
     Multiple identical printhead chips must be capable of being linked together to form an effectively horizontal assembled printhead. 
     Although there are several possible internal arrangements, construction and assembly tolerance issues have made an internal arrangement of a dropped triangle (ie a set of rows) of nozzles within a series of rows of nozzles, as shown in  FIG. 71 . These printheads can be linked together as shown in  FIG. 72 . 
     Compensation for the triangle is preferably performed in the printhead, but if the storage requirements are too large, the triangle compensation can occur in SoPEC. However, if the compensation is performed in SoPEC, it is required in the present embodiment that there be an even number of nozzles on each side of the triangle. 
     It will be appreciated that the triangle disposed adjacent one end of the chip provides the minimum on-printhead storage requirements. However, where storage requirements are less critical, other shapes can be used. For example, the dropped rows can take the form of a trapezoid. 
     The join between adjacent heads has a 45° angle to the upper and lower chip edges. The joining edge will not be straight, but will have a sawtooth or similar profile. The nominal spacing between tiles is 10 microns (measured perpendicular to the edge). SoPEC can be used to compensate for both horizontal and vertical misalignments of the print heads, at some cost to memory and/or print quality. 
     Note also that paper movement is fixed for this particular design. 
     A print rate of 60 A4/Letter pages per minute is possible. The printhead will assume the following:
         page length=297 mm (A4 is longest page length)   an inter-page gap of 60 mm or less (current best estimate is more like 15+/−5 mm       

     This implies a line rate of 22,500 lines per second. Note that if the page gap is not to be considered in page rate calculations, then a 20 KHz line rate is sufficient. 
     Assuming the page gap is required, the printhead must be capable of receiving the data for an entire line during the line time. i.e. 5 colors □ 1280 dots □ 22,500 lines=144 MHz or better (173 MHz for 6 colours). 
     The SRM043 is a CMOS and MEMS integrated chip. The MEMS structures/nozzles can eject ink which has passed through the substrate of the CMOS via small etched holes. 
     The SRM043 has nozzles arranged to create a accurately placed 1600 dots per inch printout. The SRM043 has 5 colours, 1280 nozzles per colour. 
     The SRM043 is designed to link to a similar SRM043 with perfect alignment so the printed image has no artifacts across the join between the two chips. 
     SRM043 contains 10 rows of nozzles, arranged as upper and lower row pairs of 5 different inks. The paired rows share a common ink channel at the back of the die. The nozzles in one of the paired rows are horizontally spaced 2 dot pitches apart, and are offset relative to each other. 
     1600 dpi has a dot pitch of DP □ 15.875 □m. The MEMS print nozzle unit cell is 2DP wide by 5DP high (31.75 □m×79.375 □m). To achieve 1600 dpi per colour, 2 horizontal rows of (1280/2) nozzles are placed with a horizontal offset of 5DP (2.5 cells). Vertical offset is 3.5DP between the two rows of the same colour and 10.1DP between rows of different colour. This slope continues between colours and results in a print area which is a trapezoid as shown in  FIG. 73 . 
     Within a row, the nozzles are perfectly aligned vertically. 
     For ink sealing reasons a large area of silicon beyond the end nozzles in each row is required on the base of the die, near where the chip links to the next chip. To do this the first 4*Row#+4−2*(Row# mod 2) nozzles from each row are vertical shifted down DP. 
     Data for the nozzles in the triangle must be delayed by 10 line times to match the triangle vertical offset. The appropriate number of data bits at the start of each row are put into a FIFO. Data from the FIFO&#39;s output is used instead. The rest of the data for the row bypasses the FIFO. Because the MEMS are enabled with a PMOSFET driver from Vpos it is necessary to ensure that this driver is disabled at and after power up. This means that Vdd must be supplied with RstL asserted (0 Volts). At least 3 clk cycles must be applied before deasserting RstL. 
     SRM043 consists of a core of 10 rows of 640 MEMS constructed ink ejection nozzles. Around each of these nozzles is a CMOS unit cell. 
     The basic operation of the SRM043 is to
         receive dot data for all colours for a single line   fire all nozzles according to that dot data       

     To minimise peak power, nozzles are not all fired simultaneously, but are spread as evenly as possible over a line time. The firing sequence and nozzle placement are designed taking into account paper movement during a line, so that dots can be optimally placed on the page. Registers allow optimal placement to be achieved for a range of different MEMs firing pulse widths, printing speeds and inter-chip placement errors. 
     The MEMS device can be modelled as a resistor, that is heated by a pulse applied to the gate of a large PMOS FET. 
     The profile (firing) pulse has a programmable width which is unique to each ink colour. The magnitude of the pulse is fixed by the external Vpos supply less any voltage drop across the driver FET. 
     The unit cell contains a flip-flop forming a single stage of a shift register extending the length of each row. These shift registers, one per row, are filled using a register write command in the data stream. Each row may be individually addressed, or a row increment command can be used to step through the rows. 
     When a FIRE command is received in the data stream, the data in all the shift register flip-flops is transferred to a dot-latch in each of the unit cells, and a fire cycle is started to eject ink from every nozzle that has a 1 in its dot-latch. 
     The FIRE command will reset the row addressing to the last row. A DATA_NEXT command preceding the first row data will then fill the first row. While the firing/ejection is taking place, the data for the next line may be loaded into the row shift registers. 
     Due to the mechanism used to handle the falling triangle block of nozzles the following restrictions apply:
         The rows must be loaded in the same order between FIRE commands. Any order may be used, but it must be the same each time.   Data must be provided for each row, sufficient to fill the triangle segment.       

     A fire cycle sequences through all of the nozzles on the chip, firing all of those with a 1 in their dot-latch. The sequence is one row at a time, each row taking 10% of the total fire cycle. Within a row, a programmable value called the column Span is used to control the firing. Each &lt;span&gt;&#39;th nozzle in the row is fired simultaneously, then their immediate left neighbours, repeating &lt;span&gt; times until all nozzles in that row have fired. This is then repeated for each subsequent row, according the row firing order described below. Hence the maximum number of nozzles firing at any one time is 640 divided by &lt;span&gt;. 
     In the default case, row  0  of the chip is fired first, according to the span pattern. These nozzles will all fired in the first 10% of the line time. Next all nozzles in row  2  will fire in the same pattern, similarly then rows  4 ,  6  then  8 . Immediately following, half way through the line time, row  1  will start firing, followed by rows  3 , 5 , 7  then  9 . 
       FIG. 78  shows this for the case of Span=2. 
     The 1/10 line time together with the 10.1DP vertical colour pitch appear on paper as a 10DP line separation. The odd and even same-colour rows physically spaced 3.5DP apart vertically fired half a line time apart results on paper as a 3DP separation. 
     A modification of the firing order shown in  FIG. 78  can be used to assist in the event of vertical misalignment of the printhead when physically mounted into a cartridge. This is termed micro positioning in this document. 
       FIG. 79  shows in general how the fire pattern is modified to compensate for mounting misalignment of one printhead with respect to its linking partner. The base construction of the printhead separates the row pairs by slightly more than an integer times the dot Pitch to allow for distributing the fire pattern over the line period. This architecture can be exploited to allow micro positioning. 
     Consider for example the printhead on the right being placed 0.3 dots lower than the reference printhead to the left. The reference printhead if fired with the standard pattern. 
     The width of the pulse that turns a heater on to eject an ink drop is called the profile. The profile is a function of the MEMs characteristics and the ink characteristics. Different profiles might be used for different colours. 
     Optimal dot placement requires each line to take 10% of the line time. to fire. So, while a row for a colour with a shorter profile could in theory be fired faster than a colour with a longer profile, this is not desirable for dot placement. 
     To address this, the fire command includes a parameter called the fireperiod. This is the time allocated to fire a single nozzle, irrespective of its profile. For best dot placement, the fireperiod should be chosen to be greater than the longest profile. If a profile is programmed to be longer than a fireperiod, then that nozzle pulse will be extended to match the profile. This extends the line time, it does not affect subsequent profiles. This will degrade dot placement accuracy on paper. 
     The fireperiod and profiles are measured in wclks. A wclk is a programmable number of 288 Mhz clock periods. The value written to fireperiod and profile registers should be one less than the desired delay in wclks. These registers are all 8 bits wide, so periods from 1 to 256 wclks can be achieved. The Wclk prescaler should be programmed such that the longest profile is between 128 and 255 wclks long. This gives best line time resolution. 
     The ideal value for column span and fireperiod can be chosen based on the maximum profile and the linetime. The linetime is fixed by the desired printing speed, while the maximum profile depends on ink and MEMs characteristics as described previously. 
     To ensure than all nozzles are fired within a line time, the following relationship must be obeyed: # rows*columnspan*fireperiod&lt;linetime 
     To reduce the peak Vpos current, the column span should be programmed to be the largest value that obeys the above relationship. This means making fireperiod as small as possible, consistent with the requirement that fireperiod be longer than the maximum profile, for optimal dot placement. 
     As an example, with a 1 uS maximum profile width, 10 rows, and 44 us desired row time a span of 4 yields 4*10*1=40 uS minimum time. A span of 5 would require 50 uS which is too long. Having chosen the column span, the fireperiod should be adjusted upward from its minimum so that nozzle firing occupies all of the available linetime. In the above example, fireperiod would be be set to 44 us/(4*10)=1.1 uS. This will produce a 10% gap between individual profiles, but ensures that dots are accurately placed on the page. Using a fireperiod longer or shorter than the scaled line time will result in inaccurately placed ink dots. 
     The fireperiod to be used is updated as a parameter to every FIRE command. This is to allow for variation in the linetime, due to changes in paper speed. This is important because a correctly calculated fireperiod is essential for optimal dot placement. 
     If a FIRE command is received before a fire cycle is complete, the error bit NO_EARLY_ERR is set and the next fire cycle is started immediately. The final column(s) of the previous cycle will not have been fully fired. This can only occur if the new FIRE command is given early than expected, based on the previous fireperiod. 
     It is possible to use SoPEC to send dot data to a printhead that is using less than its full complement of rows. For example, it is possible that the fixative, IR and black channels will be omitted in a low end, low cost printer. Rather than design a new printhead having only three channels, it is possible to select which channels are active in a printhead with a larger number of channels (such as the presently preferred channel version). It may be desirable to use a printhead which has one or more defective nozzles in up to three rows as a printhead (or printhead module) in a three color printer. 
     It would be disadvantageous to have to load empty data into each empty channel, so it is preferable to allow one or more rows to be disabled in the printhead. 
     The printhead already has a register that allows each row to be individually enabled or disabled (register ENABLE at address  0 ). Currently all this does is suppress firing for a non-enabled row. 
     To avoid SoPEC needing to send blank data for the unused rows, the functionality of these bits is extended to: 
     1. skip over disabled rows when DATA_NEXT register is written; 
     2. force dummy bits into the TDC FIFO for a disabled rows, corresponding to the number of nozzles in the dropped triangle section for that row. These dummy bits are written immediately following the first row write to the fifo following a fire command. 
     Using this arrangement, it is possible to operate a 6 color printhead as a 1 to 6 color printhead, depending upon which mode is set. The mode can be set by the printer controller (SoPEC); once set, SoPEC need only send dot data for the active channels of the printhead. 
     It will be appreciated by those skilled in the art that the foregoing represents only a preferred embodiment of the present invention. Those skilled in the relevant field will immediately appreciate that the invention can be embodied in many other forms.