¡¡
Ŀǰ£¬ÍøÂç¼¼ÊõÔÚµç×Ó²úÆ·ÖеÄÓ¦ÓÃÔ½À´Ô½¹ã£¬¸ü¶àµÄǶÈëʽÉ豸ÐèÒªÌá¹©ÍøÂç½Ó¿Ú£¬ÒÔ·½±ãÓëÍⲿ»¥ÁªÍ¨Ñ¶¡£ÏÖÔÚÁ÷ÐеĴó¶àÊýǶÈëʽCPU(ÈçARM¡¢PPC)¶¼ÌṩÁË´ËÀà½Ó¿Ú£¬µ«¶ÔÓÚһЩÏà¶Ô¸´ÔÓµÄǶÈëʽϵͳÀ´Ëµ£¬¿ÉÄÜÐèÒªÀ©Õ¹ÒÔÌ«Íø¿Ú£¬ÒÔÂú×ãÍøÂçͨѶÐèÒª¡£±¾ÎĽéÉÜÒ»ÖÖпîÍøÂç½Ó¿ÚоƬDM9000A£¬Ëü¿ÉÒԺܷ½±ãµÄʵÏÖÓëǶÈëʽCPUµÄ½Ó¿Ú£¬ÊµÏÖÀ©Õ¹ÒÔÌ«Íø¿ÚµÄ¹¦ÄÜ¡£
DM9000A
¡¡¡¡DM9000AÊÇÖйų́ÍåDAVICOM¹«Ë¾ÍƳöµÄÒ»¿î¸ßËÙÒÔÌ«Íø½Ó¿ÚоƬ£¬Æä»ù±¾ÌØÕ÷ÊÇ£º¼¯³É10/100MÎïÀí²ã½Ó¿Ú£»ÄÚ²¿´øÓÐ16K×Ö½ÚSRAMÓÃ×÷½ÓÊÕ·¢Ë͵ÄFIFO»º´æ£»Ö§³Ö8/16bitÁ½ÖÖÖ÷»ú¹¤×÷ģʽ£»Í¨¹ýHPÈÏÖ¤µÄAUTO-Mdix(Ö§³ÖÖ±½Ó»¥Á¬×Ô¶¯·×ª)¹¦ÄÜ£»Ö§³ÖTCP/IP¼ÓËÙ(IPV4 check sum offload)¼õÇáCPU¸ºµ££¬Ìá¸ßÕû»úЧÄÜ£»10ns I/O¶Áдʱ¼ä¡£DM9000AÒÔÌ«Íø¿ØÖÆÆ÷×ñÑIEEE°ä²¼µÄ802.3ÒÔÌ«Íø´«ÊäÐÒé¡£¸Ãµç·»¹¼¯³ÉÁËEEPROM½Ó¿Ú£¬×Ô¾Ùʱͨ¹ýEEPROM½Ó¿ÚÊäÈ뵽оƬÖУ¬´Ó¶øÊµÏÖ×Ô¶¯³õʼ»¯¡£
Ó²¼þ½Ó¿ÚÉè¼Æ
¡¡¡¡DM9000A¿ÉÒԺܷ½±ãµÄÓëĿǰÖ÷Á÷µÄǶÈëʽCPUÒÔ8λ»ò16λµÄ×ÜÏß·½Ê½Á¬½Ó£¬±¾ÎÄÉè¼ÆµÄϵͳCPUΪAT91RM9200£¬ËüÊÇÒ»¸ö²ÉÓÃARMºËµÄ32λ΢´¦ÀíÆ÷¡£¶þÕߵĽӿÚÉè¼ÆÈçͼ1¡£

ͼ1 DM9000AÓëAT91RM9200Ó²¼þÁ¬½Ó
¡¡¡¡ÏµÍ³Éϵçʱ£¬AT91RM9200ͨ¹ý×ÜÏßÅäÖÃDM9000AÄÚ²¿ÍøÂç¿ØÖÆ¼Ä´æÆ÷(NCR)¡¢ÖжϼĴæÆ÷(ISR)µÈ£¬Íê³ÉDM9000AµÄ³õʼ»¯¡£Ëæºó£¬DM9000A½øÈëÊý¾ÝÊÕ·¢µÈ´ý״̬¡£µ±AT91RM9200ÏòÒÔÌ«Íø·¢ËÍÊý¾Ýʱ£¬ÏȽ«Êý¾Ý´ò°ü³ÉUDP»òIPÊý¾Ý°ü£¬²¢Í¨¹ý16 bit×ÜÏß·¢Ë͵½DM9000AµÄÊý¾Ý·¢ËÍ»º´æÖУ¬È»ºó½«Êý¾Ý³¤¶ÈµÈÐÅÏ¢Ìî³äµ½DM9000AµÄÏàÓ¦¼Ä´æÆ÷ÄÚ£¬Ê¹ÄÜ·¢ËÍ¡£µ±DM9000A½ÓÊÕµ½Íâ²¿ÍøÂçËÍÀ´µÄÒÔÌ«ÍøÊý¾Ýʱ£¬Ê×Ïȼì²âÊý¾ÝÖ¡µÄºÏ·¨ÐÔ£¬Èç¹ûÖ¡Í·±êÖ¾ÓÐÎó»ò´æÔÚCRCУÑé´íÎó£¬Ôò½«¸ÃÖ¡Êý¾Ý¶ªÆú¡£·ñÔò½«Êý¾ÝÖ¡»º´æµ½ÄÚ²¿RAM£¬²¢Í¨¹ýÖжϱê־λ֪ͨAT91RM9200£¬ÓÉAT91RM9200¶ÔDM9000A½ÓÊÕµ½µÄÊý¾Ý½øÐд¦Àí¡£
LinuxÇý¶¯ÊµÏÖ
¡¡¡¡LinuxÍøÂçÇý¶¯Ìåϵ½á¹¹
¡¡¡¡ÔÚLinux²Ù×÷ϵͳÖеÄÉ豸Çý¶¯£¬¸ù¾Ý¸÷ÀàÍâΧI/OÉ豸µÄ²»Í¬£¬·ÖΪÈýÀ࣬¼´×Ö·ûÉ豸(Èç¼üÅÌ¡¢LCD) Çý¶¯¡¢¿éÉ豸(ÈçÓ²ÅÌ¡¢CF¿¨) Çý¶¯ºÍÍøÂçÉ豸(ÈçÍø¿¨) Çý¶¯¡£ LinuxÍøÂçÉ豸Çý¶¯³ÌÐò½á¹¹ÉÏÓÉËIJ¿·Ö×é³É(ͼ2)£ºÍøÂçÐÒé½Ó¿Ú£¬ÍøÂçÉ豸½Ó¿Ú£¬É豸Çý¶¯¹¦ÄÜ²ã¼°ÍøÂçÉ豸½éÖÊ¡£

ͼ2 LinuxÍøÂçÇý¶¯Ìåϵ½á¹¹
Éè¼Æ¿ª·¢LinuxÍøÂçÇý¶¯³ÌÐòʱ£¬×îÖ÷ÒªµÄ¹¤×÷¾ÍÊÇÍê³ÉÉ豸Çý¶¯¹¦Äܲ㡣ÀàËÆÓÚ¶Ô×Ö·ûÉ豸ºÍ¿éÉ豸µÄ´¦Àí£¬ÎªÁËÆÁ±ÎÍøÂç»·¾³ÖÐÎïÀíÍøÂçÉ豸µÄ¶àÑùÐÔ£¬LinuxÀûÓÃÃæÏò¶ÔÏóµÄ˼Ïë¶ÔËùÓеÄÍøÂçÎïÀíÉ豸½øÐгéÏ󣬶¨ÒåÁËÒ»¸öͳһµÄ½Ó¿Ú¡£¶ÔÓÚËùÓÐÍøÂçÓ²¼þµÄ·ÃÎʶ¼ÊÇͨ¹ý½Ó¿Ú½øÐеģ¬½Ó¿ÚÏòÓû§ÌṩÁËÒ»¸ö¶ÔÓÚËùÓÐÀàÐ͵ÄÍøÂçÓ²¼þÒ»Ö»¯µÄ²Ù×÷¼¯ºÏ¡£LinuxÄÚºËÌṩµÄÍ³Ò»ÍøÂçÉ豸½á¹¹Îªnet_device£¬´Ë½á¹¹ÌåλÓÚÍøÂçÇý¶¯²ãµÄºËÐĵØÎ»¡£
¡¡¡¡net_device ÖÐÓкܶ๩ϵ·ÃÎʺÍÐÒé²ãµ÷ÓõÄÉ豸·½·¨£¬ÆäÖаüÀ¨£º
¡¡¡¡%26#183; dev-%26gt;open£º´ò¿ªÉ豸¡£open·½·¨Ó¦µ±×¢²áÍøÂçÉ豸ÐèÒªµÄÈκÎϵͳ×ÊÔ´( I/O ¿Ú£¬IRQ£¬ DMAµÈ)£¬´ò¿ªÓ²¼þ£¬½øÐÐÉ豸ҪÇóµÄÆäËûÉèÖá£
¡¡¡¡%26#183; dev¡ª%26gt;stop£ºÍ£Ö¹É豸¡£ ¸Ãº¯ÊýÓ¦µ±»Ö¸´ÔÚ´ò¿ªÊ±½øÐеIJÙ×÷¡£
¡¡¡¡%26#183; dev-%26gt;hard_start_xmit£º·¢Ëͱ¨ÎÄ¡£
¡¡¡¡%26#183; dev-%26gt;tx_timeout£º·¢Ëͳ¬Ê±µ÷Óõķ½·¨,ËüÓ¦µ±´¦ÀíÕâ¸öÎÊÌâ²¢»Ö¸´±¨ÎÄ·¢ËÍ¡£
¡¡¡¡%26#183; dev-%26gt;set_mac_address£ºÐÞ¸ÄÍøÂçµÄÓ²¼þMACµØÖ·¡£
¡¡¡¡ÍøÂçÇý¶¯¾ÍÊÇҪʵÏÖÕâЩ¾ßÌåµÄÉ豸·½·¨¡£
¡¡¡¡É豸³õʼ»¯
¡¡¡¡ÍøÂçµÄ³õʼ»¯ÊÇÉ豸¹¤×÷µÄµÚÒ»²½¡£µ±ÏµÍ³¼ÓÔØÍøÂçÇý¶¯Ä£¿éµÄʱºò£¬¾Í»áµ÷Óóõʼ»¯¹ý³Ì¡£Ê×ÏÈÀûÓú¯Êýrequest_mem_regionÓ³ÉäDM9000AµÄÊý¾Ý¡¢µØÖ·¶Ë¿Ú£¬Í¨¹ýdmfe_probeº¯Êý¼ì²âÍøÂçÎïÀíÉ豸ÊÇ·ñ´æÔÚ£¬¼ì²âDM9000AÄÚ²¿´®ÐÐNICµÄÖµÊÇ·ñÕýÈ·£¬È»ºóÔÙ¶ÔÉ豸½øÐÐ×ÊÔ´ÅäÖ㬹¹ÔìÉ豸µÄnet_deviceÊý¾Ý½á¹¹¡£°üÀ¨Ò»Ð©µÍ²ãÓ²¼þÐÅÏ¢£ºbase_addr(ÍøÂç½Ó¿ÚµÄ I/O »ùµØÖ·)£¬irq(°²ÅŵÄÖжϺÅ)µÈ¡£
¡¡¡¡´ò¿ªÉ豸ºÍ¹Ø±ÕÉ豸
¡¡¡¡open·½·¨ÔÚÍøÂçÉ豸±»¼¤»îµÄʱ±»µ÷Ó㬾ßÌåDM9000AµÄÓ²¼þ³õʼ»¯¹¤×÷·Åµ½ÕâÀïÀ´×ö¡£¶ÔÓÚDM9000AÐèÒªÍê³ÉµÄ³õʼ»¯°üÀ¨£º¶ÔDM9000AÄÚ²¿Éϵ磬Èí¼þ¸´Î»£¬Í¨¹ýNCR¼Ä´æÆ÷ÉèÖÃÍøÂ繤×÷ģʽ,¿ÉÒÔÑ¡ÔñÉèÖÃÄÚ²¿»òÕßÍⲿPHY¡¢È«Ë«¹¤»òÕß°ëË«¹¤Ä£Ê½¡¢Ê¹ÄÜ»½ÐÑʼþµÈÍøÂç²Ù×÷£¬¶ÔRX£¯TXÖжÏʹÄÜ£¬Ê¹ÄÜÊý¾Ý½ÓÊÕ¹¦ÄÜ¡£µ÷ÓÃrequest_irq()ÉêÇëÖжϺŵǼÇÖжϴ¦Àíº¯Êý£¬µ÷ÓÃnetif_carrier_onÕì²âÁ¬½Ó״̬¡£
¡¡¡¡Æô¶¯¶¨Ê±Æ÷£¬µ÷ÓÃnetif_start_queue¼¤»îÉ豸·¢ËͶÓÁС£
¡¡¡¡ÕâÀï¶ÔDM9000AµÄÖжÏÉè¼Æ×öÁËÒ»¸öÌØÊâ´¦Àí£ºÍ¨³£AT91RM9200Ìṩ×î¶à32¸öÖжÏÔ´£¬Ä¬ÈÏÌṩ7¸öÍⲿÖжÏÔ´£¬µ«¶ÔÓڽϸ´ÔÓµÄǶÈëʽϵͳ£¬¿ÉÄÜ»áÃæÁÙÖжÏÔ´²»¹»ÓõÄÇé¿ö¡£ÓÉÓÚAT91RM9200µÄPIO¿ÉÒÔʵÏÖ¹¦Äܸ´Óã¬Òò´Ë¿ÉÒ԰ѶàÓàµÄIOÒý½ÅÅäÖÃΪ¿ÉÓõÄÖжÏÔ´¡£¹Ê±¾ÏµÍ³ÖУ¬Éè¼ÆDM9000AÖжÏÔ´ÓëAT91RM9200ÍⲿI/O¿ÚPD8Òý½ÅÏàÁ¬¡£Ò»¸öPIO¶Ë¿ÚµÄ32¸öÒý½Å¹²ÏíÒ»¸öÖжÏID£¬Ö»ÐèÒªÔÚÖжÏ״̬¼Ä´æÆ÷ÖÐÇø·Ö¾ßÌåÄĸöÒý½ÅÒýÆðÖжϣ¬È»ºóתÏòÌØ¶¨µÄÖжϴ¦Àíº¯ÊýÖ´ÐвÙ×÷£¬¾Í¿ÉÒÔʵÏÖÖжϴ¦Àí¡£
¡¡¡¡closeËù×öµÄ¹¤×÷ºÍopenÏà·´£¬Ö÷ÒªÊÍ·Åopen»ñµÃµÄ×ÊÔ´£¬ÒÔ¼õÉÙϵͳ¸ºµ£¡£
¡¡¡¡Êý¾Ý°ü·¢ËÍ
¡¡¡¡Êý¾Ý°üµÄ·¢ËͺͽÓÊÕÊÇʵÏÖLinuxÍøÂçÇý¶¯³ÌÐòÖÐÁ½¸ö×î¹Ø¼üµÄ¹ý³Ì£¬¶ÔÕâÁ½¸ö¹ý³Ì´¦ÀíµÄºÃ»µ½«Ö±½ÓÓ°Ïìµ½Çý¶¯³ÌÐòµÄÕûÌåÔËÐÐÖÊÁ¿¡£
¡¡¡¡Êý¾Ý´«Êäͨ¹ýhard_start_xmitº¯ÊýʵÏÖ£¬Ê×ÏȰѴæ·ÅÔÚÌ×½Ó×Ö»º³åÇøÖеÄÊý¾Ý·¢Ë͵½ÍøÂçоƬDM9000AÄÚ²¿µÄTX FIFO SRAMÖУ¬¸Ã»º³åÇøÊÇÓÉÊý¾Ý½á¹¹sk_buff±íʾ£¬°ÑÒª´«Ë͵ÄÊý¾Ý³¤¶ÈдÈëDM9000AÖеĴ«Êä°ü³¤¶È¼Ä´æÆ÷TXPLLºÍTXPLHÖС£È»ºóʹÄÜ´«Êä¡£Èç¹ûÊý¾Ý·¢Ëͳɹ¦£¬Ôò»á´¥·¢Ò»´ÎÖжϡ£
¡¡¡¡Êµ¼ÊÖлá³öÏÖ¶à¸öÊý¾ÝÖ¡´«Ê䣬ÐèÒª¿¼ÂÇ×ö²¢·¢´¦Àí¡£ÔÚ·¢ËÍʱ¼ì²â´«Êä¶ÓÀýÔÝʱÂúÔØÊ±¾ÍҪͨ¹ýnetif_stop_queueÀ´ÔÝÍ££¬µ±·¢ËÍÍê³É´¥·¢Öжϴ¦Àíʱ£¬µ÷ÓÃnetif_wake_queueº¯ÊýÀ´ÖØÐÂÆô¶¯´«Êä¶ÓÀý¡£
¡¡¡¡ÍøÂç´«ÊäÓÉÓÚϵͳæ»òÓ²¼þµÄÎÊÌâ·¢ÉúÑÓ³Ù£¬Ôò»áµ÷Óô«Ëͳ¬Ê±´¦Àíº¯Êýtx_timeout£¬¶ÔÓ²¼þ¸´Î»²Ù×÷¡£
Êý¾Ý°ü½ÓÊÕ
¡¡¡¡Êý¾Ý°üµÄ½ÓÊÕÊÇͨ¹ýÖжϴ¦Àí£¬µ±ÓÐÊý¾Ýµ½´ïʱ£¬¾Í²úÉúÖжÏÐźţ¬ÍøÂçÉ豸Çý¶¯¹¦Äܲã¾Íµ÷ÓÃÊý¾Ý°ü½ÓÊÕ³ÌÐòÀ´´¦ÀíÊý¾Ý°üµÄ½ÓÊÕ£¬È»ºóÍøÂçÐÒé½Ó¿Ú²ãµ÷ÓÃnetif_rxº¯Êý°Ñ½ÓÊÕµ½µÄÊý¾Ý°ü´«Êäµ½ÍøÂçÐÒéµÄÉÏ²ã½øÐд¦Àí¡£
¡¡¡¡DM9000A½ÓÊÕ»º´æÇøÖеÄÿ֡Êý¾ÝÓÉ4×Ö½Ú³¤µÄÊײ¿¡¢ÓÐЧÊý¾ÝºÍCRCУÑéÐòÁй¹³É¡£Êײ¿4×Ö½ÚÒÀ´ÎÊÇ01H¡¢ÒÔÌ«ÍøÖ¡×´Ì¬¡¢ÒÔÌ«ÍøÖ¡³¤¶ÈµÍ×ֽںͳ¤¶È¸ß×Ö½Ú£¬Êý¾Ý°ü½ÓÊÕ³ÌÐòÊ×Ïȼì²âÈç¹ûµÚÒ»¸ö×Ö½ÚÊÇ01H£¬Ôò˵Ã÷ÓÐÊý¾Ý£»Èç¹ûÊÇ00H£¬Ôò˵Ã÷ÎÞÊý¾Ý£¬ÐèÒª½øÐи´Î»¡£È»ºóµ÷Óú¯Êýdev_alloc_skbÉêÇëÒ»¿ésk_buff½á¹¹»º³åÇø£¬´ÓDM9000A¶Á³öÊý¾Ý·ÅÖõ½»º³åÇøÀ¸ù¾Ý»ñÈ¡µÄ³¤¶ÈÐÅÏ¢£¬ÅжÏÊÇ·ñ¶ÁÍêÒ»Ö¡¡£Èç¹û¶ÁÍ꣬½Ó×ŶÁÏÂÒ»Ö¡£¬Ö±µ½Óöµ½Ê××Ö½ÚÊÇ00HµÄÖ¡£¬ËµÃ÷½ÓÊÕÊý¾ÝÒѶÁÍê¡£½ÓÏÂÀ´Ìî³äsk_buffÖеÄһЩÐÅÏ¢£¬Ê¹Ö®³ÉΪ¹æ·¶µÄsk_buff½á¹¹£¬×îºóµ÷ÓÃnetif_rx()º¯Êý½«½ÓÊÕµ½µÄÊý¾Ý´«Êäµ½ÍøÂçÐÒéµÄÉϲ㡣
½áÓï
¡¡¡¡¸ÃÉè¼Æ³É¹¦ÓÃÓÚÄ³ÍøÂç²âÊÔÉ豸µÄÖ÷¿ØÄ£¿éÉÏ£¬¿ÉÒÔͨ¹ýÒÔÌ«Íø½ÓÈëInternet£¬´Ó¶øÊµÏÖ´ÓInternetÉÏ¼à¿ØÇ¶ÈëʽÉ豸¡£
²Î¿¼ÎÄÏ×£º
1. Davicom Corporation,DM9000A Application Notes V1.20, 2005
¡¡¡¡2. Lessandro Rubini,Jonathan Corbet. Linux Device Drivers, second edition£¬O¡¯Reilly %26amp; Associates,2002
3. Àî·½¾ü¡¢½ðì¿¶«£¬Ç¶ÈëʽLinuxÍøÂçÇý¶¯³ÌÐòµÄÑо¿ÓëʵÏÖ£¬ÏÖ´úµç×Ó¼¼Êõ£¬2005£¬16
4. Atmel Corporation, AT91RM9200 Datasheet, version E, 2005