亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dma.c

?? The main purpose of this project is to add a new scheduling algorithm to GeekOS and to implement a s
?? C
字號:
/* * 8237A DMA Controller Support * Copyright (c) 2003, David H. Hovemeyer <daveho@cs.umd.edu> * $Revision: 1.14 $ *  * This is free software.  You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". *//* * Information sources: * - Intel 8237A datasheet: *    http://www.nondot.org/sabre/os/files/MiscHW/8237A_DMAControllerDatasheet.pdf * - Linux include/asm-i386/dma.h * - http://docs.freebsd.org/doc/3.4-RELEASE/usr/share/doc/handbook/dma.html  *//* * NOTES: * - Currently, we only support DMA channels 0-3. * * - Address lines A0..A3 of the master 8237A are wired to the *   low bits of the port I/O address bus in the obvious way. *   For some reason, A0..A3 of the slave 8237A (channels 4-7) *   are wired to bits 1..4 of the I/O address bus, so for that *   controller the port addresses must be shifted left one bit. *   Here is how register ports might be parameterized by *   controller and register: * *	#define COMMAND_REG		0x8 *	#define DMA_REG(ctrlr,reg)	(((ctrlr)==0)?(reg):(0xD0+((reg)<<1))) *	#define DMA_COMMAND_REG(ctrlr)	DMA_REG(ctrlr,COMMAND_REG) */#include <geekos/screen.h>#include <geekos/range.h>#include <geekos/int.h>#include <geekos/io.h>#include <geekos/dma.h>/* ---------------------------------------------------------------------- * Definitions * ---------------------------------------------------------------------- *//* * DMA controller ports and definitions. * See Figures 5 and 6 of 8237A datasheet. *//* * Only support channels 0..3 for now. */#define VALID_CHANNEL(chan)	(((chan) >= 0) && ((chan) < 4))/* * The DMA controller can only address the first 2^24 * bytes of memory. */#define DMA_MAX_ADDR		0x1000000UL#define VALID_MEM(start,size)	Check_Range_Under((ulong_t)(start),(size),DMA_MAX_ADDR)/* * Master controller: */#define DMA_BASE		0x00	 /*!< Base I/O address of controller */#define DMA_COMMAND_REG		0x08	 /*!< Command register (output) */#define DMA_STATUS_REG		0x08	 /*!< Status register (input) */#define DMA_REQUEST_REG		0x09	 /*!< Request register (output) */#define DMA_MASK_ONE_REG	0x0A	 /*!< Set/reset one bit of mask (output) */#define DMA_MODE_REG		0x0B	 /*!< Mode register (output) */#define DMA_CLEAR_FF_REG	0x0C	 /*!< Clear byte pointer flip-flop (output) */#define DMA_MASTER_CLEAR_REG	0x0D	 /*!< Reset the controller (output) */#define DMA_TEMP_REG		0x0D	 /*!< Storage for mem/mem xfers (input) */#define DMA_CLEAR_MASK_REG	0x0E	 /*!< Clear all mask bits (output) */#define DMA_MASK_ALL_REG	0x0F	 /*!< Set all bits of mask (output) *//* * Access to base/current address andbase/current word count. * The port address depends on the channel. */#define DMA_ADDR_REG(chan)	(((chan) & 0x3)<<1)	 /*!< Base and current address (input,output) */#define DMA_COUNT_REG(chan)	((((chan) & 3)<<1)|1)  /*!< Base and current work count (input,output) *//* * Mask register bits: */#define DMA_MASK_ENABLE		(1<<2)	 /*!< Mask register bit to enable a channel *//* * Mode register bits: */#define DMA_MODE_SINGLE		0x40	 /*!< Set up for single transfer */#define DMA_MODE_CASCADE	0xC0	 /*!< Set up for cascade transfer (from slave controller) */#define DMA_MODE_READ		0x04	 /*!< Read transfer */#define DMA_MODE_WRITE		0x08	 /*!< Write transfer *//* * DMA page registers */static const uchar_t s_dmaPageRegisterList[] = {    0x87,	 /* DMA Channel 0 */    0x83,	 /* DMA Channel 1 */    0x81,	 /* DMA Channel 2 */    0x82,	 /* DMA Channel 3 */};#define DMA_PAGE_REG(chan)	(s_dmaPageRegisterList[chan])  /*!< DMA page register for a channel */#define IS_RESERVED(chan)	((s_allocated & (1 << (chan))) != 0)/*#define DEBUG_DMA */#ifdef DEBUG_DMA#  define Debug(args...) Print(args)#else#  define Debug(args...)#endif/* ---------------------------------------------------------------------- * Variables * ---------------------------------------------------------------------- */static uchar_t s_allocated;	 /*!< Which channels have been allocated. *//* ---------------------------------------------------------------------- * Public functions * ---------------------------------------------------------------------- *//** * Initialize the DMA controllers. */void Init_DMA(void){    Print("Initializing DMA Controller...\n");    /* Reset the controller */    Out_Byte(DMA_MASTER_CLEAR_REG, 0);}/** * Reserve given DMA channel. * @param chan the channel to reserve * @return true if successful, false if not */bool Reserve_DMA(int chan){    bool iflag = Begin_Int_Atomic();    bool result = false;    KASSERT(VALID_CHANNEL(chan));    if (!IS_RESERVED(chan)) {	/* Channel is available; unmask it. */	Out_Byte(DMA_MASK_ONE_REG, chan & 3);	/* Mask channel as allocated */	s_allocated |= (1 << chan);	result = true;    }    End_Int_Atomic(iflag);    return result;}/** * Set up a DMA transfer. * @param direction the direction of the transfer (DMA_READ or DMA_WRITE) * @param chan the channel * @param addr the address of the buffer * @param size number of bytes to transfer */void Setup_DMA(enum DMA_Direction direction, int chan, void *addr_, ulong_t size){    uchar_t mode = 0;    ulong_t addr = (ulong_t) addr_;    /* Make sure parameters are sensible */    KASSERT(direction == DMA_READ || direction == DMA_WRITE);    KASSERT(VALID_CHANNEL(chan));    KASSERT(IS_RESERVED(chan));    KASSERT(VALID_MEM(addr, size));    KASSERT(size > 0);    KASSERT(size <= (0xffff - (addr & 0xffff)));  /* can't cross 64K boundary */    /* Set up transfer mode */    mode |= DMA_MODE_SINGLE;    mode |= (direction == DMA_READ) ? DMA_MODE_READ : DMA_MODE_WRITE;    mode |= (chan & 3);    Debug("Setup_DMA(%s,%d,%x,%d)\n", direction == DMA_READ ? "DMA_READ" : "DMA_WRITE",	chan, addr, size);    Debug("Setup_DMA: mode=%02x\n", mode);    Debug("DMA_ADDR_REG for channel is %02x\n", DMA_ADDR_REG(chan));    Debug("DMA_PAGE_REG for channel is %02x\n", DMA_PAGE_REG(chan));    Debug("DMA_COUNT_REG for channel is %02x\n", DMA_COUNT_REG(chan));    /* Temporarily mask the DMA channel */    Mask_DMA(chan);    /* Write the transfer mode */    Out_Byte(DMA_MODE_REG, mode);    /* Clear the byte pointer flip-flop */    Out_Byte(DMA_CLEAR_FF_REG, 0);  /* doesn't matter what value is written here */    /* Write the transfer address (LSB, then MSB) */    Out_Byte(DMA_ADDR_REG(chan), addr & 0xFF);    Out_Byte(DMA_ADDR_REG(chan), (addr >> 8) & 0xFF);    /* Write the page register */    Out_Byte(DMA_PAGE_REG(chan), (addr >> 16) & 0xFF);    /*     * Write the count (LSB, then MSB)     * Note that the count is one less that the number of bytes transferred     */    --size;    Out_Byte(DMA_COUNT_REG(chan), size & 0xFF);    Out_Byte(DMA_COUNT_REG(chan), (size >> 8) & 0xFF);    /* Now we can unmask the channel again */    Unmask_DMA(chan);}/** * Mask given DMA channel. * The channel must have already been reserved. * @param chan the channel */void Mask_DMA(int chan){    KASSERT(VALID_CHANNEL(chan));    KASSERT(IS_RESERVED(chan));    Out_Byte(DMA_MASK_ONE_REG, (1 << 2) | (chan & 3));}/** * Unmask given DMA channel. * The channel must have already been reserved. * @param chan the channel */void Unmask_DMA(int chan){    KASSERT(VALID_CHANNEL(chan));    KASSERT(IS_RESERVED(chan));    Out_Byte(DMA_MASK_ONE_REG, chan & 3);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜不卡视频| 日本欧美韩国一区三区| 久久久精品免费免费| 欧美一区二区三区不卡| 欧美三级蜜桃2在线观看| 欧美午夜不卡视频| 91精品国产综合久久久蜜臀粉嫩| 7777女厕盗摄久久久| 7777女厕盗摄久久久| 欧美成人免费网站| 久久久久久久久久久99999| 国产欧美一区二区精品性色超碰| 国产亚洲成av人在线观看导航| 国产欧美一区二区三区在线老狼| 国产精品国产精品国产专区不蜜| 亚洲情趣在线观看| 一区二区三区四区蜜桃| 视频一区二区中文字幕| 蜜臀av性久久久久蜜臀aⅴ流畅 | av电影一区二区| 成人性生交大片免费看中文 | 香蕉乱码成人久久天堂爱免费| 亚洲已满18点击进入久久| 天天综合色天天| 国精产品一区一区三区mba桃花| 成人听书哪个软件好| 在线日韩av片| 精品久久五月天| 日韩美女视频一区| 奇米影视一区二区三区| 成人午夜电影网站| 欧美精品在线一区二区三区| 精品国一区二区三区| 国产精品成人免费精品自在线观看| 亚洲国产一区二区a毛片| 黄色日韩网站视频| 一本大道久久精品懂色aⅴ| 91精品国产91久久久久久一区二区| 国产亚洲成av人在线观看导航| 亚洲国产中文字幕在线视频综合 | 亚洲成a人片在线观看中文| 美女国产一区二区三区| 91欧美一区二区| 精品91自产拍在线观看一区| 亚洲男同1069视频| 国产精品白丝jk黑袜喷水| 在线免费观看成人短视频| 精品伦理精品一区| 亚洲国产日日夜夜| 99这里只有精品| 欧美精品一区二区三区一线天视频 | 欧美一区日韩一区| 亚洲美女视频在线观看| 国产精品18久久久久久久网站| 欧美色男人天堂| 亚洲天堂成人在线观看| 国产一区二区三区高清播放| 欧美二区在线观看| 亚洲国产综合91精品麻豆| 白白色 亚洲乱淫| 久久久精品国产免费观看同学| 男女男精品视频网| 欧洲一区二区三区在线| 最近日韩中文字幕| jlzzjlzz亚洲女人18| 久久精品水蜜桃av综合天堂| 老司机午夜精品99久久| 欧美三级一区二区| 亚洲丶国产丶欧美一区二区三区| 色综合 综合色| 亚洲精品一二三区| 色综合久久中文综合久久97| 自拍偷拍亚洲激情| 色哟哟国产精品免费观看| 国产精品久久综合| 91伊人久久大香线蕉| 一区在线观看免费| 91丨九色丨黑人外教| 亚洲天天做日日做天天谢日日欢| av在线不卡电影| 亚洲天堂a在线| 欧美视频一区二区| 亚洲国产一区二区三区青草影视| 欧美性大战xxxxx久久久| 日韩精品免费视频人成| 日韩一区二区免费视频| 国产在线精品免费| 国产欧美视频一区二区| 91在线观看地址| 亚洲国产乱码最新视频| 欧美电影一区二区| 黄页视频在线91| 中文子幕无线码一区tr| 日本精品视频一区二区三区| 亚洲一区二区视频| 欧美一级片在线| 国产精品77777竹菊影视小说| 国产精品久久久久三级| 欧美在线视频日韩| 久久91精品久久久久久秒播| 国产精品免费免费| 欧洲亚洲国产日韩| 麻豆国产精品777777在线| 国产蜜臀97一区二区三区| 色综合久久久久综合体桃花网| 五月婷婷久久综合| 久久久精品免费观看| 欧美色图激情小说| 国产综合色视频| 亚洲激情在线播放| 精品动漫一区二区三区在线观看| www.亚洲人| 免费成人av资源网| 亚洲三级免费观看| 精品免费日韩av| 精品视频一区二区不卡| 粉嫩av一区二区三区粉嫩| 亚洲成av人**亚洲成av**| 久久精品日产第一区二区三区高清版| 91免费视频观看| 老司机免费视频一区二区三区| 日韩理论片网站| 精品美女在线播放| 7777精品久久久大香线蕉| 成人av资源站| 精品制服美女久久| 婷婷久久综合九色综合伊人色| 国产欧美精品一区二区色综合| 在线不卡免费av| 一本久久综合亚洲鲁鲁五月天| 国产一区二区三区在线看麻豆| 亚洲国产婷婷综合在线精品| 亚洲视频免费在线| 久久久欧美精品sm网站| 欧美人与性动xxxx| 色欧美88888久久久久久影院| 国产乱子伦一区二区三区国色天香| 视频在线在亚洲| 亚洲一区二区欧美| 一区二区三区四区在线播放| 国产精品电影一区二区三区| 久久九九99视频| 精品乱码亚洲一区二区不卡| 91精品国产免费| 正在播放亚洲一区| 欧美精品丝袜久久久中文字幕| 91麻豆国产香蕉久久精品| 99久久精品国产麻豆演员表| 懂色av中文一区二区三区| 国产一区二区三区在线看麻豆| 精品中文字幕一区二区| 国产一区不卡精品| 国产资源精品在线观看| 久久精品国产99久久6| 麻豆成人在线观看| 精品亚洲国内自在自线福利| 国模娜娜一区二区三区| 国产麻豆成人传媒免费观看| 久久9热精品视频| 国产一区不卡视频| 99re热这里只有精品免费视频| av一本久道久久综合久久鬼色| av中文字幕在线不卡| 91久久精品一区二区| 在线视频你懂得一区二区三区| 91成人看片片| 欧美一区二区三区视频在线观看| 91精品久久久久久久91蜜桃| 精品国产乱码久久久久久蜜臀| 久久天天做天天爱综合色| 国产丝袜在线精品| 亚洲欧美在线视频观看| 亚洲在线视频网站| 免费精品视频在线| 国产传媒欧美日韩成人| 91女厕偷拍女厕偷拍高清| 欧美精品久久99久久在免费线| 538prom精品视频线放| 久久综合久久99| 亚洲色图欧洲色图| 免费一区二区视频| av电影在线观看完整版一区二区| 欧美性猛交xxxxxx富婆| 久久夜色精品一区| 亚洲欧美另类在线| 经典三级一区二区| 91国在线观看| 久久久久国产精品免费免费搜索| 1区2区3区精品视频| 美女视频网站黄色亚洲| 91麻豆文化传媒在线观看| 91精品国产综合久久久蜜臀粉嫩| 国产精品久久久久久久久快鸭| 亚洲国产日韩一区二区| 国产麻豆视频精品| 欧美人妇做爰xxxⅹ性高电影| 日本一区二区免费在线观看视频 | 国产精品二三区| 捆绑调教一区二区三区| 色婷婷av久久久久久久|