¡¡¡¡ºÜ¶àÇé¿öÏÂÉ豸Çý¶¯³ÌÐòºÍÉ豸֮¼äµÄÊý¾Ý½»»»ÊÇͨ¹ýÄÚ´æ ½øÐеġ£ÓÐÁ½ÖÖ¿ÉÄܵıäÌ壺
¡¡¡¡(a) ÄÚ´æÎ»ÓÚÉ豸¿¨ÉÏ
¡¡¡¡(b) ÄÚ´æÎª¼ÆËã»úµÄÖ÷ÄÚ´æ
¡¡¡¡Çé¿ö(a)ÖУ¬Çý¶¯³ÌÐò¿ÉÄÜÐèÒªÔÚ¿¨ÉϵÄÄÚ´æÓëÖ÷´æÖ®¼äÀ´»Ø
¿½±´Êý¾Ý¡£ÎªÁ˽«¿¨ÉϵÄÄÚ´æÓ³Éäµ½Äں˵ÄÐ鵨ַ¿Õ¼ä£¬¿¨ÉÏÄÚ´æµÄ
ÎïÀíµØÖ·ºÍ³¤¶È±ØÐë±»¶¨ÒåΪSYS_RES_MEMORY×ÊÔ´¡£
È»ºó×ÊÔ´¾Í¿ÉÒÔ±»·ÖÅä²¢¼¤»î£¬ËüµÄÐéµØÖ·Í¨¹ýʹÓà rman_get_virtual()
»ñÈ¡¡£½ÏÀϵÄÇý¶¯³ÌÐò ½«º¯Êýpmap_mapdev()
ÓÃÓÚ´ËÄ¿µÄ£¬ÏÖÔÚ
²»Ó¦µ±ÔÙÖ±½ÓʹÓô˺¯Êý¡£ËüÒѳÉΪ×ÊÔ´¼¤»îµÄÒ»¸öÄÚ²¿²½Öè¡£
¡¡¡¡´ó¶àÊýISA¿¨µÄÄÚ´æÅäÖÃΪÎïÀíµØÎ»ÓÚ640KB-1MB·¶Î§Ö®¼äµÄ ij¸öλÖá£Ä³Ð©ISA¿¨ÐèÒª¸ü´óµÄÄڴ淶Χ£¬Î»ÓÚ16MÒÔϵÄij¸ö λÖã¨ÓÉÓÚISA×ÜÏßÉÏ24λµØÖ·ÏÞÖÆ£©¡£ÕâÖÖÇé¿öÏ£¬Èç¹û»úÆ÷ÓÐ ±ÈÉ豸ÄÚ´æµÄÆðʼµØÖ·¸ü¶àµÄÄڴ棨»»¾ä»°Ëµ£¬ËüÃÇÖØµþ£©£¬Ôò ±ØÐëÔÚ±»É豸ʹÓõÄÄÚ´æÆðʼµØÖ·´¦ÅäÖÃÒ»¸öÄÚ´æ¿Õ¶´¡£Ðí¶à BIOSÔÊÐíÔÚÆðʼÓÚ14MB»ò15MB´¦ÅäÖÃ1MµÄÄÚ´æ¿Õ¶´¡£Èç¹ûBIOS ÕýÈ·µØ±¨¸æÄÚ´æ¿Õ¶´£¬FreeBSD¾ÍÄܹ»ÕýÈ·´¦ÀíËüÃÇ£¨´ËÌØÐÔ ÔÚÀÏBIOSÉÏ¿ÉÄÜ»á³öÎÊÌ⣩¡£
¡¡¡¡Çé¿ö(b)ÖУ¬Ö»ÊÇÊý¾ÝµÄµØÖ·±»·¢Ë͵½É豸£¬É豸ʹÓÃDMAʵ¼Ê ·ÃÎÊÖ÷´æÖеÄÊý¾Ý¡£´æÔÚÁ½¸öÏÞÖÆ£ºÊ×ÏÈ£¬ISA¿¨Ö»ÄÜ·ÃÎÊ16MBÒÔÏ µÄÄÚ´æ¡£Æä´Î£¬Ð鵨ַ¿Õ¼äÖÐÁ¬ÐøµÄÒ³ÃæÔÚÎïÀíµØÖ·¿Õ¼äÖпÉÄܲ» Á¬Ðø£¬É豸¿ÉÄܲ»µÃ²»½øÐзÖÉ¢/ÊÕ¼¯²Ù×÷¡£×ÜÏß×ÓϵͳΪÕâЩÎÊÌâ ÌṩÏÖ³ÉÏֳɵĽâ¾ö°ì·¨£¬Ê£ÏµıØÐëÓÉÇý¶¯³ÌÐò×Ô¼ºÍê³É¡£
¡¡¡¡DMAÄÚ´æ·ÖÅäʹÓÃÁËÁ½¸ö½á¹¹£¬ bus_dma_tag_t
ºÍ bus_dmamap_t
¡£
±êÇ©£¨tag£©ÃèÊöÁËDMAÄÚ´æÒªÇóµÄÌØÐÔ¡£Ó³É䣨map£©±íʾ°´ÕÕÕâЩ
ÌØÐÔ·ÖÅäµÄÄÚ´æ¿é¡£¶à¸öÓ³Éä¿ÉÒÔÓëͬһ±êÇ©¹ØÁª¡£
¡¡¡¡±êÇ©°´ÕÕ¶ÔÌØÐԵļ̳жø±»×éÖ¯³ÉÊ÷ÐͲã´Î½á¹¹¡£×Ó±êÇ©¼Ì³Ð¸¸ ±êÇ©µÄËùÓÐÒªÇ󣬿ÉÒÔÁîÆä¸üÑϸñ£¬µ«²»ÔÊÐí·Å¿íÒªÇó¡£
¡¡¡¡Ò»°ãµØ£¬Ã¿¸öÉ豸µ¥Ôª´´½¨Ò»¸ö¶¥²ã±êÇ©£¨Ã»Óи¸±êÇ©£©¡£Èç¹û ÿ¸öÉ豸ÐèÒª²»Í¬ÒªÇóµÄÄÚ´æÇø£¬ÔòΪÿ¸öÄÚ´æÇø¶¼»á´´½¨Ò»¸ö±êÇ©£¬ÕâЩ ±êÇ©×÷Ϊ¸¸±êÇ©µÄº¢×Ó¡£
¡¡¡¡Ê¹ÓñêÇ©´´½¨Ó³ÉäµÄ·½·¨ÓÐÁ½ÖÖ¡£
¡¡¡¡ÆäÒ»£¬·ÖÅäÒ»´ó¿é·ûºÏ±êǩҪÇóµÄÁ¬ÐøÄڴ棨ÒÔºó¿ÉÒÔ±»ÊÍ·Å£©¡£ ÕâÒ»°ãÓÃÓÚ·ÖÅäΪÁËÓëÉ豸ͨÐŶø´æÔÚÏà¶Ô½Ï³¤Ê±¼äµÄÄÇЩÄÚ´æÇø¡£ ½«ÕâÑùµÄÄÚ´æ¼ÓÔØµ½Ó³ÉäÖзdz£ÈÝÒ×£ºËü×ÜÊDZ»¿´×÷λÓÚÊʵ±ÎïÀí Äڴ淶ΧµÄÒ»Õû¿é¡£
¡¡¡¡Æä¶þ£¬½«ÐéÄâÄÚ´æÖеÄÈÎÒâÇøÓò¼ÓÔØµ½Ó³ÉäÖС£ÕâÆ¬ÄÚ´æµÄ ÿһҳ¶¼±»¼ì²é£¬¿´ÊÇ·ñ·ûºÏÓ³ÉäµÄÒªÇó¡£ÈçºÎ·ûºÏÔòÁôÔÚÔʼλÖᣠÈç¹û²»·ûºÏÔò·ÖÅäÒ»¸öеķûºÏÒªÇóµÄ ¡°·´µ¯Ò³Ãæ(bounce page)¡±£¬ÓÃ×÷ÖÐ¼ä´æ´¢¡£ µ±´Ó²»·ûºÏµÄÔÊ¼Ò³ÃæÐ´ÈëÊý¾Ýʱ£¬Êý¾ÝÊ×Ïȱ»¿½±´µ½·´µ¯Ò³Ã棬 È»ºó´Ó·´µ¯Ò³Ãæ´«µÝµ½É豸¡£µ±¶Áȡʱ£¬Êý¾Ý½«»á´ÓÉ豸µ½·´µ¯Ò³Ã棬 È»ºó±»¿½±´µ½ËüÃDz»·ûºÏµÄÔÊ¼Ò³Ãæ¡£ÔʼºÍ·´µ¯Ò³ÃæÖ®¼äµÄ¿½±´ ´¦Àí±»³Æ×÷ͬ²½¡£ÕâÒ»°ãÓÃÓÚµ¥´Î´«ÊäµÄ»ù´¡Ö®ÉÏ£ºÃ¿´Î´«Êäʱ ¼ÓÔØ»º³åÇø£¬Íê³É´«Êä£¬Ð¶ÔØ»º³åÇø¡£
¡¡¡¡¹¤×÷ÔÚDMAÄÚ´æÉϵĺ¯ÊýÓУº
int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t
alignment, bus_size_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr, bus_dma_filter_t
*filter, void *filterarg, bus_size_t maxsize, int nsegments, bus_size_t maxsegsz, int
flags, bus_dma_tag_t *dmat)
´´½¨Ð±êÇ©¡£³É¹¦Ôò·µ»Ø0£¬·ñÔò·µ»Ø´íÎóÂë¡£
parent - ¸¸±êÇ©»òÕßNULL£¬ NULLÓÃÓÚ´´½¨¶¥²ã±êÇ©¡£
alignment -
¶Ô½«Òª·ÖÅ䏸±êÇ©µÄÄÚ´æÇøµÄ¶ÔÆëÒªÇ󡣡°no specific alignment¡±Ê±ÖµÎª1¡£½öÓ¦ÓÃÓÚÒÔºóµÄ
bus_dmamem_alloc()
¶ø²»ÊÇ bus_dmamap_create()
µ÷Óá£
boundary - ÎïÀíµØÖ·±ß½ç£¬
·ÖÅäÄÚ´æÊ±²»ÄÜ´©¹ý¡£¶ÔÓÚ¡°no boundary¡± ʹÓÃ0¡£½öÓ¦ÓÃÓÚÒÔºóµÄ bus_dmamem_alloc()
¶ø²»ÊÇ bus_dmamap_create()
µ÷Óá£
±ØÐëΪ2µÄ³Ë·½¡£Èç¹û¼Æ»®ÒԷDzãµþDMA·½Ê½Ê¹ÓÃÄڴ棨Ҳ¾ÍÊÇ˵£¬ DMAµØÖ·ÓÉISA
DMA¿ØÖÆÆ÷Ìṩ¶ø²»ÊÇÉ豸×ÔÉí£©£¬ÔòÓÉÓÚDMAÓ²¼þ ÏÞÖÆ£¬±ß½ç±ØÐë²»ÄÜ´óÓÚ64KB (64*1024)¡£
lowaddr, highaddr - Ãû×ÖÉÔ΢ ÓÐЩÎ󵼡£ÕâЩֵÓÃÓÚÏÞÖÆ¿ÉÓÃÓÚÄÚ´æ·ÖÅäµÄÎïÀíµØÖ·µÄÔÊÐí ·¶Î§¡£ÆäÈ·Çк¬Òå¸ù¾ÝÒÔºó²»Í¬µÄʹÓöøÓÐËù²»Í¬¡£
¶ÔÓÚbus_dmamem_alloc()
£¬
´Ó0µ½lowaddr-1µÄËùÓеØÖ·±»ÊÓΪÔÊÐí£¬¸ü¸ßµÄµØÖ·²»ÔÊÐí ʹÓá£
¶ÔÓÚbus_dmamap_create()
£¬ ±ÕÇø¼ä[lowaddr;
highaddr]Ö®ÍâµÄËùÓеØÖ·±»ÊÓΪ¿É·ÃÎÊ¡£
·¶Î§Ö®ÄڵĵØÖ·Ò³Ãæ±»´«µÝ¸ø¹ýÂ˺¯Êý£¬ÓÉËü¾ö¶¨ÊÇ·ñ¿É·ÃÎÊ¡£
Èç¹ûûÓÐÌṩ¹ýÂ˺¯Êý£¬ÔòÕû¸öÇø¼ä±»ÊÓΪ²»¿É·ÃÎÊ¡£
¶ÔÓÚISAÉ豸£¬Õý³£Öµ£¨Ã»ÓйýÂ˺¯Êý£©Îª£º
lowaddr = BUS_SPACE_MAXADDR_24BIT
highaddr = BUS_SPACE_MAXADDR
filter, filterarg - ¹ýÂ˺¯Êý¼°Æä
²ÎÊý¡£Èç¹ûfilterΪNULL£¬Ôòµ±µ÷Óà bus_dmamap_create()
ʱ£¬Õû¸öÇø¼ä [lowaddr,
highaddr]±»ÊÓΪ²»¿É·ÃÎÊ¡£ ·ñÔò£¬Çø¼ä[lowaddr; highaddr]ÄÚµÄÿ¸ö±»ÊÔͼ·ÃÎʵÄÒ³ÃæµÄ
ÎïÀíµØÖ·±»´«µÝ¸ø¹ýÂ˺¯Êý£¬ÓÉËü¾ö¶¨ÊÇ·ñ¿É·ÃÎÊ¡£¹ýÂ˺¯ÊýµÄ ÔÐÍΪ£ºint filterfunc(void *arg, bus_addr_t
paddr)
¡£µ±Ò³Ãæ¿ÉÒÔ±»·ÃÎÊʱËü±ØÐë ·µ»Ø0£¬·ñÔò·µ»Ø·ÇÁãÖµ¡£
maxsize - ͨ¹ý´Ë±êÇ©¿ÉÒÔ·ÖÅäµÄ ×î´óÄÚ´æÖµ£¨ÒÔ×ֽڼƣ©¡£ÓÐʱÕâ¸öÖµºÜÄѹÀË㣬»òÕß¿ÉÒÔÈÎÒâ´ó£¬ ÕâÖÖÇé¿öÏ£¬¶ÔÓÚISAÉ豸Õâ¸öÖµ¿ÉÒÔÉèΪ BUS_SPACE_MAXSIZE_24BIT¡£
nsegments - É豸֧³ÖµÄ·ÖÉ¢/ÊÕ¼¯¶Î µÄ×î´óÊýÄ¿¡£Èç¹û²»¼ÓÏÞÖÆ£¬ÔòʹÓÃÓ¦µ±Ê¹ÓÃÖµ BUS_SPACE_UNRESTRICTED¡£ ½¨Òé¶Ô¸¸±êǩʹÓÃÕâ¸öÖµ£¬¶øÎª×ÓËï±êǩָ¶¨Êµ¼ÊÏÞÖÆ¡£ nsegmentsÖµµÈÓÚ BUS_SPACE_UNRESTRICTED µÄ±êÇ©²»ÄÜÓÃÓÚʵ¼Ê¼ÓÔØÓ³É䣬½ö¿ÉÒÔ½«ËüÃÇ×÷Ϊ¸¸±êÇ©¡£ nsetments µÄʵ¼ÊÏÞÖÆ´óԼΪ250-300£¬ÔٸߵÄÖµ½«µ¼ÖÂÄں˶ÑÕ»Òç³ö£¨Ó²¼þ ÎÞ·¨Õý³£Ö§³ÖÄÇô¶àµÄ·ÖÉ¢/ÊÕ¼¯»º³åÇø£©¡£
maxsegsz - É豸֧³ÖµÄ·ÖÉ¢/ÊÕ¼¯¶Î µÄ×î´ó³ß´ç¡£¶ÔÓÚISAÉ豸µÄ×î´