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

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

?? mcd.c.txt

?? Linux塊設備驅動分析與模擬實現
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
  1 /*
  2         linux/kernel/blk_drv/mcd.c - Mitsumi CDROM driver
  3 
  4         Copyright (C) 1992  Martin Harriss
  5 
  6         martin@bdsi.com
  7 
  8         This program is free software; you can redistribute it and/or modify
  9         it under the terms of the GNU General Public License as published by
 10         the Free Software Foundation; either version 2, or (at your option)
 11         any later version.
 12 
 13         This program is distributed in the hope that it will be useful,
 14         but WITHOUT ANY WARRANTY; without even the implied warranty of
 15         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 16         GNU General Public License for more details.
 17 
 18         You should have received a copy of the GNU General Public License
 19         along with this program; if not, write to the Free Software
 20         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 21 
 22         HISTORY
 23 
 24         0.1     First attempt - internal use only
 25         0.2     Cleaned up delays and use of timer - alpha release
 26         0.3     Audio support added
 27         0.3.1 Changes for mitsumi CRMC LU005S march version
 28                    (stud11@cc4.kuleuven.ac.be)
 29         0.3.2 bug fixes to the ioclts and merged with ALPHA0.99-pl12
 30                    (Jon Tombs <jon@robots.ox.ac.uk>)
 31         0.3.3 Added more #defines and mcd_setup()
 32                    (Jon Tombs <jon@gtex02.us.es>)
 33 */
 34 
 35 
 36 #include <linux/errno.h>
 37 #include <linux/signal.h>
 38 #include <linux/sched.h>
 39 #include <linux/timer.h>
 40 #include <linux/fs.h>
 41 #include <linux/kernel.h>
 42 #include <linux/cdrom.h>
 43 #include <linux/ioport.h>
 44 
 45 /* #define REALLY_SLOW_IO  */
 46 #include <asm/system.h>
 47 #include <asm/io.h>
 48 #include <asm/segment.h>
 49 
 50 #define MAJOR_NR MITSUMI_CDROM_MAJOR
 51 #include "blk.h"
 52 #include <linux/mcd.h>
 53 
 54 #if 0
 55 static int mcd_sizes[] = { 0 };
 56 #endif
 57 
 58 static int mcdPresent = 0;
 59 
 60 static char mcd_buf[2048];      /* buffer for block size conversion */
 61 static int   mcd_bn   = -1;
 62 static short mcd_port = MCD_BASE_ADDR;
 63 static int   mcd_irq  = MCD_INTR_NR;
 64 
 65 static int McdTimeout, McdTries;
 66 static struct wait_queue *mcd_waitq = NULL;
 67 
 68 static struct mcd_DiskInfo DiskInfo;
 69 static struct mcd_Toc Toc[MAX_TRACKS];
 70 static struct mcd_Play_msf mcd_Play;
 71 
 72 static int audioStatus;
 73 static char mcdDiskChanged;
 74 static char tocUpToDate;
 75 static char mcdVersion;
 76 
 77 static void mcd_transfer(void);
 78 static void mcd_start(void);
 79 static void mcd_status(void);
 80 static void mcd_read_cmd(void);
 81 static void mcd_data(void);
 82 static void do_mcd_request(void);
 83 static void hsg2msf(long hsg, struct msf *msf);
 84 static void bin2bcd(unsigned char *p);
 85 static int bcd2bin(unsigned char bcd);
 86 static int mcdStatus(void);
 87 static void sendMcdCmd(int cmd, struct mcd_Play_msf *params);
 88 static int getMcdStatus(int timeout);
 89 static int GetQChannelInfo(struct mcd_Toc *qp);
 90 static int updateToc(void);
 91 static int GetDiskInfo(void);
 92 static int GetToc(void);
 93 static int getValue(unsigned char *result);
 94 
 95 
 96 void mcd_setup(char *str, int *ints)
 97 {
 98    if (ints[0] > 0)
 99       mcd_port = ints[1];
100    if (ints[0] > 1)      
101       mcd_irq  = ints[2];
102 }
103 
104  
105 int
106 check_mcd_media_change(int full_dev, int flag)
107 {
108    int retval, target;
109 
110 
111 #if 1    /* the below is not reliable */
112    return 0;
113 #endif  
114    target = MINOR(full_dev);
115 
116    if (target > 0) {
117       printk("mcd: Mitsumi CD-ROM request error: invalid device.\n");
118       return 0;
119    }
120 
121    retval = mcdDiskChanged;
122    if (!flag)
123    {
124       mcdDiskChanged = 0;
125    }
126 
127    return retval;
128 }
129 
130 
131 /*
132  * Do a 'get status' command and get the result.  Only use from the top half
133  * because it calls 'getMcdStatus' which sleeps.
134  */
135 
136 static int
137 statusCmd(void)
138 {
139         int st, retry;
140 
141         for (retry = 0; retry < MCD_RETRY_ATTEMPTS; retry++)
142         {
143 
144                 outb(MCMD_GET_STATUS, MCDPORT(0));      /* send get-status cmd */
145                 st = getMcdStatus(MCD_STATUS_DELAY);
146                 if (st != -1)
147                         break;
148         }
149 
150         return st;
151 }
152 
153 
154 /*
155  * Send a 'Play' command and get the status.  Use only from the top half.
156  */
157 
158 static int
159 mcdPlay(struct mcd_Play_msf *arg)
160 {
161         int retry, st;
162 
163         for (retry = 0; retry < MCD_RETRY_ATTEMPTS; retry++)
164         {
165                 sendMcdCmd(MCMD_PLAY_READ, arg);
166                 st = getMcdStatus(2 * MCD_STATUS_DELAY);
167                 if (st != -1)
168                         break;
169         }
170 
171         return st;
172 }
173 
174 
175 long
176 msf2hsg(struct msf *mp)
177 {
178         return bcd2bin(mp -> frame)
179                 + bcd2bin(mp -> sec) * 75
180                 + bcd2bin(mp -> min) * 4500
181                 - 150;
182 }
183 
184 
185 static int
186 mcd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
187                                                 unsigned long arg)
188 {
189         int i, st;
190         struct mcd_Toc qInfo;
191         struct cdrom_ti ti;
192         struct cdrom_tochdr tocHdr;
193         struct cdrom_msf msf;
194         struct cdrom_tocentry entry;
195         struct mcd_Toc *tocPtr;
196         struct cdrom_subchnl subchnl;
197 #if 0
198         struct cdrom_volctrl volctrl;
199 #endif
200 
201         if (!ip)
202                 return -EINVAL;
203 
204         st = statusCmd();
205         if (st < 0)
206                 return -EIO;
207 
208         if (!tocUpToDate)
209         {
210                 i = updateToc();
211                 if (i < 0)
212                         return i;       /* error reading TOC */
213         }
214 
215         switch (cmd)
216         {
217         case CDROMSTART:     /* Spin up the drive */
218                 /* Don't think we can do this.  Even if we could,
219                  * I think the drive times out and stops after a while
220                  * anyway.  For now, ignore it.
221                  */
222 
223                 return 0;
224 
225         case CDROMSTOP:      /* Spin down the drive */
226                 outb(MCMD_STOP, MCDPORT(0));
227                 i = getMcdStatus(MCD_STATUS_DELAY);
228 
229                 /* should we do anything if it fails? */
230 
231                 audioStatus = CDROM_AUDIO_NO_STATUS;
232                 return 0;
233 
234         case CDROMPAUSE:     /* Pause the drive */
235                 if (audioStatus != CDROM_AUDIO_PLAY)
236                         return -EINVAL;
237 
238                 outb(MCMD_STOP, MCDPORT(0));
239                 i = getMcdStatus(MCD_STATUS_DELAY);
240 
241                 if (GetQChannelInfo(&qInfo) < 0)
242                 {
243                         /* didn't get q channel info */
244 
245                         audioStatus = CDROM_AUDIO_NO_STATUS;
246                         return 0;
247                 }
248 
249                 mcd_Play.start = qInfo.diskTime;        /* remember restart point */
250 
251                 audioStatus = CDROM_AUDIO_PAUSED;
252                 return 0;
253 
254         case CDROMRESUME:    /* Play it again, Sam */
255                 if (audioStatus != CDROM_AUDIO_PAUSED)
256                         return -EINVAL;
257 
258                 /* restart the drive at the saved position. */
259 
260                 i = mcdPlay(&mcd_Play);
261                 if (i < 0)
262                 {
263                         audioStatus = CDROM_AUDIO_ERROR;
264                         return -EIO;
265                 }
266 
267                 audioStatus = CDROM_AUDIO_PLAY;
268                 return 0;
269 
270         case CDROMPLAYTRKIND:     /* Play a track.  This currently ignores index. */
271 
272                 st = verify_area(VERIFY_READ, (void *) arg, sizeof ti);
273                 if (st)
274                         return st;
275 
276                 memcpy_fromfs(&ti, (void *) arg, sizeof ti);
277 
278                 if (ti.cdti_trk0 < DiskInfo.first
279                         || ti.cdti_trk0 > DiskInfo.last
280                         || ti.cdti_trk1 < ti.cdti_trk0)
281                 {
282                         return -EINVAL;
283                 }
284 
285                 if (ti.cdti_trk1 > DiskInfo.last)
286                         ti. cdti_trk1 = DiskInfo.last;
287 
288                 mcd_Play.start = Toc[ti.cdti_trk0].diskTime;
289                 mcd_Play.end = Toc[ti.cdti_trk1 + 1].diskTime;
290 
291 #ifdef MCD_DEBUG
292 printk("play: %02x:%02x.%02x to %02x:%02x.%02x\n",
293         mcd_Play.start.min, mcd_Play.start.sec, mcd_Play.start.frame,
294         mcd_Play.end.min, mcd_Play.end.sec, mcd_Play.end.frame);
295 #endif
296 
297                 i = mcdPlay(&mcd_Play);
298                 if (i < 0)
299                 {
300                         audioStatus = CDROM_AUDIO_ERROR;
301                         return -EIO;
302                 }
303 
304                 audioStatus = CDROM_AUDIO_PLAY;
305                 return 0;
306 
307         case CDROMPLAYMSF:   /* Play starting at the given MSF address. */
308 
309                 if (audioStatus == CDROM_AUDIO_PLAY) {
310                   outb(MCMD_STOP, MCDPORT(0));
311                   i = getMcdStatus(MCD_STATUS_DELAY);
312                   audioStatus = CDROM_AUDIO_NO_STATUS;
313                 }
314 
315                 st = verify_area(VERIFY_READ, (void *) arg, sizeof msf);
316                 if (st)
317                         return st;
318 
319                 memcpy_fromfs(&msf, (void *) arg, sizeof msf);
320 
321                 /* convert to bcd */
322 
323                 bin2bcd(&msf.cdmsf_min0);
324                 bin2bcd(&msf.cdmsf_sec0);
325                 bin2bcd(&msf.cdmsf_frame0);
326                 bin2bcd(&msf.cdmsf_min1);
327                 bin2bcd(&msf.cdmsf_sec1);
328                 bin2bcd(&msf.cdmsf_frame1);
329 
330                 mcd_Play.start.min = msf.cdmsf_min0;
331                 mcd_Play.start.sec = msf.cdmsf_sec0;
332                 mcd_Play.start.frame = msf.cdmsf_frame0;
333                 mcd_Play.end.min = msf.cdmsf_min1;
334                 mcd_Play.end.sec = msf.cdmsf_sec1;
335                 mcd_Play.end.frame = msf.cdmsf_frame1;
336 
337 #ifdef MCD_DEBUG
338 printk("play: %02x:%02x.%02x to %02x:%02x.%02x\n",
339 mcd_Play.start.min, mcd_Play.start.sec, mcd_Play.start.frame,
340 mcd_Play.end.min, mcd_Play.end.sec, mcd_Play.end.frame);
341 #endif
342 
343                 i = mcdPlay(&mcd_Play);
344                 if (i < 0)
345                 {
346                         audioStatus = CDROM_AUDIO_ERROR;
347                         return -EIO;
348                 }
349 
350                 audioStatus = CDROM_AUDIO_PLAY;
351                 return 0;
352 
353         case CDROMREADTOCHDR:        /* Read the table of contents header */
354                 st = verify_area(VERIFY_WRITE, (void *) arg, sizeof tocHdr);
355                 if (st)
356                         return st;
357 
358                 tocHdr.cdth_trk0 = DiskInfo.first;
359                 tocHdr.cdth_trk1 = DiskInfo.last;
360                 memcpy_tofs((void *) arg, &tocHdr, sizeof tocHdr);
361                 return 0;
362 
363         case CDROMREADTOCENTRY:      /* Read an entry in the table of contents */
364 
365                 st = verify_area(VERIFY_WRITE, (void *) arg, sizeof entry);
366                 if (st)
367                         return st;
368 
369                 memcpy_fromfs(&entry, (void *) arg, sizeof entry);
370                 if (entry.cdte_track == CDROM_LEADOUT)
371                         /* XXX */
372                         tocPtr = &Toc[DiskInfo.last + 1];
373 
374                 else if (entry.cdte_track > DiskInfo.last
375                                 || entry.cdte_track < DiskInfo.first)
376                         return -EINVAL;
377 
378                 else
379                         tocPtr = &Toc[entry.cdte_track];
380 
381                 entry.cdte_adr = tocPtr -> ctrl_addr;
382                 entry.cdte_ctrl = tocPtr -> ctrl_addr >> 4;
383 
384                 if (entry.cdte_format == CDROM_LBA)
385                         entry.cdte_addr.lba = msf2hsg(&tocPtr -> diskTime);
386 
387                 else if (entry.cdte_format == CDROM_MSF)
388                 {
389                         entry.cdte_addr.msf.minute = bcd2bin(tocPtr -> diskTime.min);
390                         entry.cdte_addr.msf.second = bcd2bin(tocPtr -> diskTime.sec);
391                         entry.cdte_addr.msf.frame = bcd2bin(tocPtr -> diskTime.frame);
392                 }
393 
394                 else
395                         return -EINVAL;
396 
397                 memcpy_tofs((void *) arg, &entry, sizeof entry);
398                 return 0;
399 
400         case CDROMSUBCHNL:   /* Get subchannel info */
401 
402                 st = verify_area(VERIFY_WRITE, (void *) arg, sizeof subchnl);
403                 if (st)
404                         return st;
405 
406                 memcpy_fromfs(&subchnl, (void *) arg, sizeof subchnl);
407 
408                 if (GetQChannelInfo(&qInfo) < 0)
409                         return -EIO;
410 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美在线999| 中文字幕在线观看一区| 国产精品大尺度| 亚洲成人动漫在线免费观看| 国产精品中文字幕一区二区三区| 色噜噜久久综合| 国产亚洲精品7777| 日韩不卡在线观看日韩不卡视频| 丁香桃色午夜亚洲一区二区三区| 在线播放/欧美激情| 亚洲视频精选在线| 国产91综合网| 精品国产露脸精彩对白 | 日韩一区二区免费视频| 成人免费在线观看入口| 国产黄色成人av| 欧美mv日韩mv| 蜜桃久久av一区| 欧美日韩国产精品自在自线| 亚洲精品欧美在线| 91亚洲精品乱码久久久久久蜜桃| 久久亚洲精华国产精华液 | 亚洲免费视频成人| 国产精品1区2区3区| 26uuu国产电影一区二区| 蜜桃久久av一区| 日韩精品一区二区三区在线观看| 亚洲成人免费在线| 欧美色成人综合| 亚洲一二三四久久| 在线免费观看视频一区| 亚洲综合色区另类av| 欧美又粗又大又爽| 亚洲一区二区三区三| 欧美系列日韩一区| 午夜欧美一区二区三区在线播放| 在线欧美一区二区| 五月综合激情网| 91精品国产综合久久久久久| 日韩成人免费在线| 久久综合九色综合欧美亚洲| 国产毛片精品视频| 中文字幕av不卡| 色婷婷激情久久| 日韩中文字幕麻豆| 精品国产伦一区二区三区观看体验 | 亚洲一区二区欧美| 91精品国产丝袜白色高跟鞋| 六月丁香婷婷久久| 国产日韩精品视频一区| 97精品久久久久中文字幕| 一二三四区精品视频| 欧美丰满少妇xxxbbb| 韩国中文字幕2020精品| 国产精品色婷婷| 在线视频欧美精品| 韩国av一区二区三区在线观看| 精品国产一区二区三区久久久蜜月| 国产精品亚洲专一区二区三区| 日本一区二区三区免费乱视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | www.视频一区| 首页国产欧美久久| 久久天堂av综合合色蜜桃网| 555夜色666亚洲国产免| 精品影视av免费| 中文字幕一区二区三区在线观看| 色天天综合色天天久久| 久久国产三级精品| 亚洲狠狠丁香婷婷综合久久久| 91麻豆精品国产91| 99精品国产一区二区三区不卡| 亚洲最新视频在线观看| 日韩欧美卡一卡二| 日本道免费精品一区二区三区| 全部av―极品视觉盛宴亚洲| 成人免费一区二区三区视频| 欧美一区欧美二区| 色综合一区二区| 国产一区不卡在线| 日韩成人免费电影| 一区二区三区欧美视频| 久久男人中文字幕资源站| 欧美在线视频全部完| 成人动漫视频在线| 黄色小说综合网站| 日韩国产在线一| 一区二区三区成人| 欧美国产精品一区| 久久免费精品国产久精品久久久久| 欧美性色欧美a在线播放| av资源站一区| 国产精品亚洲午夜一区二区三区| 秋霞电影一区二区| 亚洲v中文字幕| 一区二区三区丝袜| 亚洲乱码一区二区三区在线观看| 久久中文字幕电影| 日韩精品一区在线| 欧美一区二区三区免费在线看| 一本到三区不卡视频| 99久久免费视频.com| 国产iv一区二区三区| 极品少妇一区二区三区精品视频| 日韩精品一级二级| 婷婷开心激情综合| 五月综合激情婷婷六月色窝| 亚洲国产视频在线| 一区二区三区精品视频在线| 亚洲天堂中文字幕| 亚洲四区在线观看| 日韩理论电影院| 成人免费一区二区三区视频 | 91精品国产入口在线| 欧美亚洲综合另类| 欧美视频三区在线播放| 欧美综合在线视频| 欧美片网站yy| 欧美一区二区三区四区高清| 日韩欧美电影一二三| 日韩精品中文字幕在线不卡尤物| 日韩一区二区视频| 久久亚洲二区三区| 国产精品美女久久福利网站| 一区精品在线播放| 一区二区视频免费在线观看| 亚洲国产成人tv| 另类人妖一区二区av| 国产一区二区三区黄视频| 国产精选一区二区三区| 国产精品原创巨作av| www.欧美色图| 在线观看日产精品| 日韩一卡二卡三卡国产欧美| 91精品国产欧美一区二区18| 精品国产一二三区| 中文字幕在线观看一区| 亚洲一区二区精品视频| 国产成人av在线影院| 国产suv一区二区三区88区| 91欧美激情一区二区三区成人| 欧美三级中文字| 精品日韩一区二区| 国产精品国产自产拍在线| 亚洲尤物视频在线| 精品在线你懂的| 91美女在线看| 日韩三级视频在线看| 中文成人av在线| 日韩av电影天堂| 成人av片在线观看| 欧美日韩国产经典色站一区二区三区| 欧美电影免费观看高清完整版在线 | 亚洲精品亚洲人成人网在线播放| 亚洲va国产va欧美va观看| 国产一区二区女| 色呦呦国产精品| 精品国产一区二区精华| 一区二区三区美女视频| 激情亚洲综合在线| 欧美在线free| 国产精品每日更新| 日本欧美久久久久免费播放网| 国产精品一二三四| 日韩一级二级三级精品视频| 亚洲图片你懂的| 国产一区二区三区四区五区美女 | 国产精品国产三级国产| 日本vs亚洲vs韩国一区三区| 91亚洲精品久久久蜜桃网站| 日韩欧美电影在线| 亚洲一区二区三区在线播放| 国产91精品免费| 日韩欧美视频在线| 亚洲成a人片综合在线| 99久久免费视频.com| 久久久久久久久蜜桃| 日本麻豆一区二区三区视频| 色婷婷久久久久swag精品| 中文字幕精品在线不卡| 国产永久精品大片wwwapp| 91精品国产综合久久久久久| 一区二区三区中文字幕| 97久久超碰精品国产| 国产精品色眯眯| 懂色av噜噜一区二区三区av| 精品99一区二区| 久久狠狠亚洲综合| 欧美一级欧美一级在线播放| 亚洲一区二区成人在线观看| 色嗨嗨av一区二区三区| 亚洲日本一区二区三区| 成人一区二区三区视频| 国产喷白浆一区二区三区| 国产在线精品一区二区三区不卡| 欧美一二三区在线观看| 青娱乐精品视频| 日韩网站在线看片你懂的| 美女视频黄免费的久久 | 色一区在线观看|