00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <drivers/floppy.h>
00036 #include <fs/blockcache.h>
00037 #include <routix/device.h>
00038 #include <routix/atomic.h>
00039 #include <routix/8259.h>
00040 #include <routix/kstdio.h>
00041 #include <routix/timer.h>
00042
00043 #define OK 0
00044
00045 int block(void);
00046 int floppy_get_result(void);
00047 int leer_sec(byte cara, byte cilindro, byte sector , byte *buffer);
00048 void dump_states(void);
00049 void dump_status_register(int numero, byte valor);
00050
00051 void leer_escribir_new();
00052 void init_floppy_block_new(void);
00053 void recalibrate_block_new(void);
00054 void motor_on_new_finish(timer_t *timer);
00055 void seek_block_new();
00056 void read_sector_block_new();
00057 void error();
00058 void error_por_timeout();
00059
00060
00061
00062
00063
00064 static void (*func)(void) = NULL;
00065
00066
00067 static block_cache_t *actual_request = NULL;
00068 #define ACTUAL_REQUEST (actual_request)
00069
00070
00071 static byte motor_status=MOTOR_OFF;
00072 static byte floppy_calibrado=0;
00073 static byte seek_status=0;
00074 static byte rw_status=0;
00075
00076
00077 static timer_t *timer_motor = NULL;
00078
00079 static timer_t *timer_timeout = NULL;
00080
00081
00082
00083 static int status[12];
00084
00085 #define ST0 status[0]
00086 #define ST1 status[1]
00087 #define ST2 status[2]
00088 #define ST3 status[3]
00089
00090
00091
00092
00093
00094 addr_t dma_address=0xA0000 - 1024;
00095
00096
00097 void motor_on()
00098 {
00099 outportb(DOR, DMA_INT | MOTA);
00100 motor_status=1;
00101 dword demora=0x3ffff;
00102 while (demora--);
00103 }
00104
00105
00106
00107
00108 void motor_on_new()
00109 {
00110 timer_motor = create_timer(USECONDS_TO_TICKS(TIME_WAIT_FOR_MOTOR_ON), NULL, motor_on_new_finish, NULL);
00111
00112 outportb(DOR, DMA_INT | MOTA);
00113 }
00114
00115
00116 void motor_on_new_finish(timer_t *timer)
00117 {
00118
00119 motor_status=MOTOR_ON;
00120
00121
00122 timer_motor = NULL;
00123
00124
00125
00126 if ( ACTUAL_REQUEST != NULL )
00127 leer_escribir_new();
00128
00129 }
00130
00131
00132 void motor_off()
00133 {
00134 outportb(DOR, DMA_INT);
00135 motor_status=0;
00136 floppy_calibrado=0;
00137 }
00138
00139
00140 void motor_off_new(timer_t *timer)
00141 {
00142 outportb(DOR, DMA_INT);
00143 motor_status=MOTOR_OFF;
00144
00145
00146 floppy_calibrado=0;
00147 seek_status=0;
00148 rw_status=0;
00149
00150
00151
00152
00153
00154
00155
00156 timer_motor = NULL;
00157 }
00158
00159
00160
00161 void set_dor(word valor)
00162 {
00163 outportb(DOR, valor);
00164 }
00165
00166
00167
00169
00171 int floppy_sendbyte(byte valor)
00172 {
00173 unsigned char msr;
00174 int timeout;
00175
00176 for (timeout=SENDBYTE_TIMEOUT; timeout; timeout--) {
00177
00178
00179 msr = inportb(MSR);
00180
00181
00182 if ( (msr & RQM) && ~(msr & DIO) ) {
00183 outportb(DATA, valor);
00184 break;
00185 }
00186
00187 }
00188
00189
00190 return timeout;
00191 }
00192
00193
00195
00197 int floppy_get_result()
00198 {
00199 unsigned char msr;
00200 byte posicion=0;
00201 int timeout;
00202
00203 for (timeout=GETBYTE_TIMEOUT; timeout; timeout--)
00204 {
00205
00206 msr = inportb(MSR) & (RQM | CMDBUSY | DIO);
00207
00208
00209 if ( msr == (RQM | CMDBUSY | DIO) )
00210 {
00211 status[posicion++]=inportb(DATA);
00212 continue;
00213 }
00214
00215 else if ( msr == RQM )
00216 {
00217 status[posicion]=NO_VALIDO;
00218 return OK;
00219 }
00220 }
00221
00222
00223 return ERR_TIMEOUT;
00224
00225 }
00226
00227
00228
00229 int init_floppy()
00230 {
00231 int i;
00232
00233
00234 outportb(DOR, 0);
00235
00236 outportb(DOR, 0x0C);
00237
00238
00239 outportb(CCR, DR_500KBPS);
00240
00241
00242 block();
00243
00244
00245
00246 for (i=0; i<4; i++) {
00247
00248 if ( ! floppy_sendbyte(SENSE_INTERRUPT_STATUS) ) {
00249 return ERR_TIMEOUT;
00250 }
00251
00252
00253 if (floppy_get_result()==ERR_TIMEOUT) {
00254 return ERR_TIMEOUT;
00255 }
00256
00257 }
00258
00259
00260
00261 if ( ! floppy_sendbyte(CONFIGURE_0) ) {
00262 return ERR_TIMEOUT;
00263 }
00264 if ( ! floppy_sendbyte(CONFIGURE_1) ) {
00265 return ERR_TIMEOUT;
00266 }
00267
00268
00269
00270
00271
00272
00273 if ( ! floppy_sendbyte( (CONF_EIS|CONF_POLL) | 0xa) ) {
00274 return ERR_TIMEOUT;
00275 }
00276 if ( ! floppy_sendbyte(0) ) {
00277 return ERR_TIMEOUT;
00278 }
00279
00280
00281 if ( ! floppy_sendbyte(SPECIFY) ) {
00282 return ERR_TIMEOUT;
00283 }
00284
00285 if ( ! floppy_sendbyte(0xC1) ) {
00286 return ERR_TIMEOUT;
00287 }
00288
00289 if ( ! floppy_sendbyte(0x8<<1) ) {
00290 return ERR_TIMEOUT;
00291 }
00292
00293
00294
00295 return OK;
00296 }
00297
00298
00299
00300
00301
00302 void init_floppy_new()
00303 {
00304
00305
00306 outportb(DOR, 0);
00307
00308 outportb(DOR, 0x0C);
00309
00310
00311 outportb(CCR, DR_500KBPS);
00312
00313
00314
00315 func=init_floppy_block_new;
00316 }
00317
00318
00319 void init_floppy_block_new(void)
00320 {
00321 int i;
00322
00323
00324 func=NULL;
00325
00326
00327
00328 for (i=0; i<4; i++) {
00329
00330 if ( ! floppy_sendbyte(SENSE_INTERRUPT_STATUS) ) {
00331
00332 }
00333
00334
00335 if (floppy_get_result()==ERR_TIMEOUT) {
00336
00337 }
00338
00339 }
00340
00341
00342
00343 if ( ! floppy_sendbyte(CONFIGURE_0) ) {
00344
00345 }
00346 if ( ! floppy_sendbyte(CONFIGURE_1) ) {
00347
00348 }
00349
00350
00351
00352
00353
00354
00355 if ( ! floppy_sendbyte( (CONF_EIS|CONF_POLL) | 0xa) ) {
00356
00357 }
00358 if ( ! floppy_sendbyte(0) ) {
00359
00360 }
00361
00362
00363 if ( ! floppy_sendbyte(SPECIFY) ) {
00364
00365 }
00366
00367 if ( ! floppy_sendbyte(0xC1) ) {
00368
00369 }
00370
00371 if ( ! floppy_sendbyte(0x8<<1) ) {
00372
00373 }
00374
00375
00376 if ( ACTUAL_REQUEST != NULL )
00377 leer_escribir_new();
00378
00379 }
00380
00381
00383
00385 #define PCN status[1]
00386
00387 int recalibrate()
00388 {
00389
00390
00391 floppy_calibrado=0;
00392
00393
00394 motor_on();
00395
00396
00397 if ( ! floppy_sendbyte(RECALIBRATE) ) {
00398 return ERR_TIMEOUT;
00399 }
00400
00401 if ( ! floppy_sendbyte(DRIVE_0) ) {
00402 return ERR_TIMEOUT;
00403 }
00404
00405 if ( block()!=OK ) {
00406 return ERR_NEED_RESET;
00407 }
00408
00409
00410 if ( ! floppy_sendbyte(SENSE_INTERRUPT_STATUS) ) {
00411 return ERR_TIMEOUT;
00412 }
00413
00414
00415 if (floppy_get_result()==ERR_TIMEOUT) {
00416 return ERR_TIMEOUT;
00417 }
00418
00419
00420 if ( ! COMMAND_OK ) {
00421
00422 dump_states();
00423 return ERR_NEED_RESET;
00424 }
00425
00426
00427 floppy_calibrado=1;
00428
00429 return OK;
00430 }
00431
00432
00433
00434 int recalibrate_new()
00435 {
00436
00437
00438 floppy_calibrado=0;
00439
00440
00441 if ( ! floppy_sendbyte(RECALIBRATE) ) {
00442 return ERR_TIMEOUT;
00443 }
00444
00445 if ( ! floppy_sendbyte(DRIVE_0) ) {
00446 return ERR_TIMEOUT;
00447 }
00448
00449
00450 func=recalibrate_block_new;
00451
00452
00453 timer_timeout = create_timer(USECONDS_TO_TICKS(TIEMPO_TIMEOUT_COMANDO), NULL, error_por_timeout, NULL);
00454
00455 if ( getvar("debugfloppy")==1 )
00456 kprintf("Envio de recalibrate_new !!\n");
00457
00458 return OK;
00459
00460 }
00461
00462 void recalibrate_block_new(void)
00463 {
00464
00465 func=NULL;
00466
00467
00468 clean_timer(timer_timeout);
00469
00470
00471 timer_timeout = NULL;
00472
00473 if ( getvar("debugfloppy")==1 )
00474 kprintf("Recalibrado ok !!\n");
00475
00476
00477 if ( ! floppy_sendbyte(SENSE_INTERRUPT_STATUS) ) {
00478
00479 error();
00480 return;
00481 }
00482
00483
00484 if (floppy_get_result()==ERR_TIMEOUT) {
00485
00486 error();
00487 return;
00488 }
00489
00490
00491 if ( ! COMMAND_OK ) {
00492 dump_states();
00493
00494 error();
00495 return;
00496 }
00497
00498
00499 floppy_calibrado=1;
00500
00501
00502 if ( ACTUAL_REQUEST != NULL )
00503 leer_escribir_new();
00504
00505
00506 }
00507
00508
00509 byte read_sector_id (void)
00510 {
00511
00512 motor_on();
00513
00514
00515 if ( ! floppy_sendbyte(READ_SECTOR_ID) ) {
00516 return ERR_TIMEOUT;
00517 }
00518
00519 if ( ! floppy_sendbyte(0) ) {
00520 return ERR_TIMEOUT;
00521 }
00522
00523 block();
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533 if (floppy_get_result()==ERR_TIMEOUT)
00534 {
00535 return ERR_TIMEOUT;
00536 }
00537
00538 byte posicion=0;
00539 while ( status[posicion] != NO_VALIDO && posicion < 12)
00540 {
00541
00542 posicion++;
00543 }
00544
00545 return 1;
00546
00547 }
00548
00549
00551
00553
00554 byte seek (byte cara, byte pista)
00555 {
00556
00557
00558 if ( ! floppy_sendbyte(SEEK) ) {
00559 return ERR_TIMEOUT;
00560 }
00561
00562 if ( ! floppy_sendbyte( (cara << 2) |DRIVE_0) ) {
00563 return ERR_TIMEOUT;
00564 }
00565
00566 if ( ! floppy_sendbyte(pista) ) {
00567 return ERR_TIMEOUT;
00568 }
00569
00570 block();
00571
00572
00573 if ( ! floppy_sendbyte(SENSE_INTERRUPT_STATUS) ) {
00574 return ERR_TIMEOUT;
00575 }
00576
00577
00578 if (floppy_get_result()==ERR_TIMEOUT) {
00579 return ERR_TIMEOUT;
00580 }
00581
00582
00583 if ( ! COMMAND_OK ) {
00584
00585 dump_states();
00586 return ERR_TIMEOUT;
00587 }
00588
00589 return OK;
00590 }
00591
00592
00593 int seek_new (byte cara, byte pista)
00594 {
00595
00596
00597 if ( ! floppy_sendbyte(SEEK) ) {
00598 return ERR_TIMEOUT;
00599 }
00600
00601 if ( ! floppy_sendbyte( (cara << 2) |DRIVE_0) ) {
00602 return ERR_TIMEOUT;
00603 }
00604
00605 if ( ! floppy_sendbyte(pista) ) {
00606 return ERR_TIMEOUT;
00607 }
00608
00609
00610 func=seek_block_new;
00611
00612
00613 timer_timeout = create_timer(USECONDS_TO_TICKS(TIEMPO_TIMEOUT_COMANDO), NULL, error_por_timeout, NULL);
00614
00615 if ( getvar("debugfloppy")==1 )
00616 kprintf("Envio de seek_new !!\n");
00617
00618 return OK;
00619 }
00620
00621 void seek_block_new()
00622 {
00623
00624 func=NULL;
00625
00626 if ( getvar("debugfloppy")==1 )
00627 kprintf("Retorno de seek_block !!\n");
00628
00629
00630 clean_timer(timer_timeout);
00631
00632
00633 timer_timeout = NULL;
00634
00635
00636
00637
00638 if ( ! floppy_sendbyte(SENSE_INTERRUPT_STATUS) ) {
00639
00640 error();
00641 return;
00642 }
00643
00644
00645 if (floppy_get_result()==ERR_TIMEOUT) {
00646
00647 error();
00648 return;
00649 }
00650
00651
00652 if ( ! COMMAND_OK ) {
00653 dump_states();
00654
00655 error();
00656 return;
00657 }
00658
00659
00660
00661
00662 seek_status=1;
00663
00664
00665 if ( ACTUAL_REQUEST != NULL ) {
00666
00667 leer_escribir_new();
00668 }
00669
00670 }
00671
00673
00675
00676 int read_sector (byte cara, byte cilindro, byte sector)
00677 {
00678
00679 init_floppy_DMA (DMA_READ);
00680
00681
00682 if ( ! floppy_sendbyte(READ_SECTOR) ) {
00683 return ERR_TIMEOUT;
00684 }
00685
00686 if ( ! floppy_sendbyte(DRIVE_0 | (cara << 2)) ) {
00687 return ERR_TIMEOUT;
00688 }
00689
00690 if ( ! floppy_sendbyte(cilindro) ) {
00691 return ERR_TIMEOUT;
00692 }
00693
00694 if ( ! floppy_sendbyte(cara) ) {
00695 return ERR_TIMEOUT;
00696 }
00697
00698 if ( ! floppy_sendbyte(sector) ) {
00699 return ERR_TIMEOUT;
00700 }
00701 if ( ! floppy_sendbyte(2) ) {
00702 return ERR_TIMEOUT;
00703 }
00704 if ( ! floppy_sendbyte( SECTORES_POR_PISTA ) ) {
00705 return ERR_TIMEOUT;
00706 }
00707 if ( ! floppy_sendbyte(27) ) {
00708 return ERR_TIMEOUT;
00709 }
00710 if ( ! floppy_sendbyte(0xff) ) {
00711 return ERR_TIMEOUT;
00712 }
00713
00714 if ( block()!=OK ) {
00715
00716 return ERR_NEED_RESET;
00717 }
00718
00719
00720 if (floppy_get_result()==ERR_TIMEOUT) {
00721 return ERR_TIMEOUT;
00722 }
00723
00724
00725 if ( ! COMMAND_OK ) {
00726 dump_states();
00727 return ERR_NEED_RESET;
00728 }
00729
00730 return OK;
00731 }
00732
00733
00734
00735 int read_sector_new (byte cara, byte cilindro, byte sector)
00736 {
00737
00738
00739
00740 init_floppy_DMA (DMA_READ);
00741
00742
00743 if ( ! floppy_sendbyte(READ_SECTOR) ) {
00744 return ERR_TIMEOUT;
00745 }
00746
00747 if ( ! floppy_sendbyte(DRIVE_0 | (cara << 2)) ) {
00748 return ERR_TIMEOUT;
00749 }
00750
00751 if ( ! floppy_sendbyte(cilindro) ) {
00752 return ERR_TIMEOUT;
00753 }
00754
00755 if ( ! floppy_sendbyte(cara) ) {
00756 return ERR_TIMEOUT;
00757 }
00758
00759 if ( ! floppy_sendbyte(sector) ) {
00760 return ERR_TIMEOUT;
00761 }
00762
00763 if ( ! floppy_sendbyte(2) ) {
00764 return ERR_TIMEOUT;
00765 }
00766
00767 if ( ! floppy_sendbyte( SECTORES_POR_PISTA ) ) {
00768 return ERR_TIMEOUT;
00769 }
00770
00771 if ( ! floppy_sendbyte(27) ) {
00772 return ERR_TIMEOUT;
00773 }
00774
00775 if ( ! floppy_sendbyte(0xff) ) {
00776 return ERR_TIMEOUT;
00777 }
00778
00779
00780 func=read_sector_block_new;
00781
00782
00783 timer_timeout = create_timer(USECONDS_TO_TICKS(TIEMPO_TIMEOUT_COMANDO), NULL, error_por_timeout, NULL);
00784
00785 return OK;
00786 }
00787
00788 void read_sector_block_new()
00789 {
00790
00791
00792 func=NULL;
00793
00794
00795 clean_timer(timer_timeout);
00796
00797
00798 timer_timeout = NULL;
00799
00800
00801 if (floppy_get_result()==ERR_TIMEOUT) {
00802
00803 error();
00804 return;
00805 }
00806
00807
00808 if ( ! COMMAND_OK ) {
00809 dump_states();
00810
00811 error();
00812 return;
00813 }
00814
00815
00816 rw_status=1;
00817
00818
00819 if ( ACTUAL_REQUEST != NULL )
00820 leer_escribir_new();
00821
00822 }
00823
00824
00825 char read_msr()
00826 {
00827 unsigned char msr;
00828
00829 msr = inportb(MSR);
00830
00831 return msr;
00832 }
00833
00835
00837
00838 static byte floppy_continuar;
00839
00840 int block(void)
00841 {
00842
00843 disable_irq(6);
00844
00845 floppy_continuar=0;
00846
00847
00848 dword timeout=0xffffffff;
00849
00850
00851 enable_irq(6);
00852
00853
00854 while (!floppy_continuar) {
00855 timeout--;
00856 if (!timeout)
00857 return ERR_TIMEOUT;
00858 }
00859
00860 return OK;
00861 }
00862
00863
00864
00866
00868
00869 void init_floppy_DMA ( byte comando )
00870 {
00871 outportb( DMA_MASK, 0x06 );
00872
00873 outportb ( 0xC, 0);
00874
00875
00876 outportb( DMA_CMD, comando );
00877
00878
00879 outportb ( DMA_CH2_ADDR, (byte) dma_address);
00880 outportb ( DMA_CH2_ADDR, (byte) (dma_address >> 8) );
00881 outportb ( DMA_CH2_PAGE, (byte) (dma_address >> 16) );
00882
00883 outportb ( DMA_CH2_COUNT, (byte) ( (BLOQUE_SIZE-1) & 0xff) );
00884 outportb ( DMA_CH2_COUNT, (byte) ( (BLOQUE_SIZE-1) >> 8) );
00885 outportb ( DMA_MASK, 2);
00886 }
00887
00888
00889
00890
00892
00893
00894
00896
00897 int leer_escribir(byte operacion, dword sector_logico, byte *buffer)
00898 {
00899 byte intentos=0;
00900 byte cara, cilindro, sector;
00901
00902
00903 intentar_nuevamente:
00904 intentos++;
00905 if (intentos > MAX_FLOPPY_TRYS ) {
00906
00907 return ERR_MAX_TRYS;
00908 }
00909
00910
00911 if (motor_status==0) {
00912 init_floppy();
00913 motor_on();
00914 }
00915
00916
00917 if (floppy_calibrado==0)
00918 if ( recalibrate()!=OK )
00919 goto intentar_nuevamente;
00920
00921
00922
00923 cara = (sector_logico / SECTORES_POR_PISTA) % CARAS_POR_PISTA;
00924 cilindro = (sector_logico / SECTORES_POR_PISTA) /CARAS_POR_PISTA;
00925 sector = (sector_logico % SECTORES_POR_PISTA) + 1;
00926
00927
00928 if ( seek(cara, cilindro) != OK) {
00929 goto intentar_nuevamente;
00930 }
00931
00932 if (operacion == READ_SECTOR) {
00933 if ( leer_sec(cara, cilindro, sector, buffer)!=OK )
00934 goto intentar_nuevamente;
00935 return OK;
00936 }
00937
00938
00939 if (operacion == WRITE_SECTOR)
00940 return OK;
00941 else return -1;
00942 }
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01004
01005
01006
01007 void leer_escribir_new()
01008 {
01009 byte cara, cilindro, sector;
01010 int cmdret;
01011
01012
01013 if ( getvar("debugfloppy")==1 )
01014 kprintf("leer_escribir_new: motor=%d calibracion=%d\n",motor_status,floppy_calibrado);
01015
01016
01017 if (motor_status==MOTOR_OFF) {
01018 if ( getvar("debugfloppy")==1 )
01019 kprintf("leer_escribir_new: Motor apagado, encendiendo\n");
01020 motor_on_new();
01021 return;
01022 }
01023
01024
01025 else if (timer_motor!=NULL) {
01026
01027
01028 clean_timer(timer_motor);
01029
01030
01031 timer_motor = NULL;
01032
01033 }
01034
01035 if ( ! floppy_calibrado ) {
01036
01037
01038
01039 if ( (cmdret=recalibrate_new()) == OK ) {
01040 return;
01041 }
01042
01043
01044 else {
01045 error();
01046 return;
01047 }
01048
01049 }
01050
01051
01052
01053 cara = (DRIVER_REQUEST_SECTOR(ACTUAL_REQUEST) / SECTORES_POR_PISTA) % CARAS_POR_PISTA;
01054 cilindro = (DRIVER_REQUEST_SECTOR(ACTUAL_REQUEST) / SECTORES_POR_PISTA) /CARAS_POR_PISTA;
01055 sector = (DRIVER_REQUEST_SECTOR(ACTUAL_REQUEST) % SECTORES_POR_PISTA) + 1;
01056
01057 if ( getvar("debugfloppy")==1 )
01058 kprintf("leer_escribir: sector logico=%d ==> h=%d c=%d s=%d\n", DRIVER_REQUEST_SECTOR(ACTUAL_REQUEST), \
01059 cara, cilindro, sector);
01060
01061
01062 if ( ! seek_status ) {
01063
01064
01065
01066 if ( (cmdret=seek_new(cara, cilindro)) == OK )
01067 return;
01068
01069
01070 else {
01071 error();
01072 return;
01073 }
01074 }
01075
01076 if ( DRIVER_REQUEST_OPERATION(ACTUAL_REQUEST) == IOREAD ) {
01077
01078 if ( getvar("debugfloppy")==1 )
01079 kprintf("leer_escribir_new: Leyendo\n");
01080
01081
01082 if ( ! rw_status ) {
01083
01084
01085 if ( (cmdret=read_sector_new(cara, cilindro, sector)) == OK )
01086 return;
01087
01088
01089 else {
01090 error();
01091 return;
01092 }
01093
01094
01095 }
01096
01097
01098 else {
01099
01100
01101 word i;
01102
01103 byte *dma_block = (byte *) dma_address;
01104 byte *buffer = DRIVER_REQUEST_BUFFER(ACTUAL_REQUEST);
01105
01106 for(i=0 ; i < BLOQUE_SIZE ; i++)
01107 *buffer++ = *dma_block++;
01108
01109
01110
01111
01112 floppy_calibrado=0;
01113 seek_status=0;
01114 rw_status=0;
01115
01116
01117 DRIVER_REQUEST_RETURN(ACTUAL_REQUEST) = 1;
01118
01119 }
01120
01121 }
01122
01123
01124 else if ( DRIVER_REQUEST_OPERATION(ACTUAL_REQUEST) == IOWRITE ) {
01125
01126 }
01127
01128
01129 endrequest(ACTUAL_REQUEST);
01130
01131
01132 ACTUAL_REQUEST=NULL;
01133
01134
01135 timer_motor = create_timer(USECONDS_TO_TICKS(TIEMPO_APAGADO_MOTOR_POR_INACTIVIDAD), NULL, motor_off_new, NULL);
01136
01137 return;
01138
01139 }
01140
01141
01142 void error_por_timeout()
01143 {
01144
01145
01146 timer_timeout = NULL;
01147
01148
01149 error();
01150
01151 }
01152
01153
01154 void error()
01155 {
01156
01157
01158
01159
01160 DRIVER_REQUEST_RETURN(ACTUAL_REQUEST) = -1;
01161
01162 floppy_calibrado=0;
01163 seek_status=0;
01164 rw_status=0;
01165
01166
01167 ACTUAL_REQUEST=NULL;
01168
01169
01170 endrequest(ACTUAL_REQUEST);
01171
01172
01173 timer_motor = create_timer(USECONDS_TO_TICKS(TIEMPO_APAGADO_MOTOR_POR_INACTIVIDAD), NULL, motor_off_new, NULL);
01174
01175 }
01176
01177 int leer_sec(byte cara, byte cilindro, byte sector , byte *buffer)
01178 {
01179 if ( read_sector(cara, cilindro , sector)!=OK )
01180 return ERR_NEED_RESET;
01181
01182 word i;
01183
01184 byte *dma_block = (byte *) dma_address;
01185 for( i=0 ; i < BLOQUE_SIZE ; i++)
01186 *buffer++ = *dma_block++;
01187
01188 return OK;
01189 }
01190
01191 void dump_states()
01192 {
01193 int posicion;
01194
01195 for (posicion=0; (posicion<sizeof(status)) && (status[posicion]!=NO_VALIDO); posicion++ )
01196 dump_status_register(posicion, status[posicion]);
01197
01198
01199 }
01200
01201
01202 static char *ic_codes[] = { "Terminacion Normal", "Terminacion erronea",
01203 "Comando invalido" , "Terminacion erronea causada por polling" };
01204
01205 void dump_status_register(int numero, byte valor)
01206 {
01207 switch(numero) {
01208
01209
01210 case 0:
01211
01212
01213
01214
01215
01216
01217 break;
01218
01219 case 1:
01220 puts("ST1:");
01221
01222
01223
01224
01225
01226
01227 break;
01228
01229 case 2:
01230 puts("ST2:");
01231
01232
01233
01234
01235
01236 break;
01237
01238 case 3:
01239 puts("ST3:");
01240
01241
01242
01243
01244 break;
01245
01246
01247
01248 }
01249
01250
01251 }
01252
01253
01254
01255
01256
01257
01258 void Floppy (void)
01259 {
01260
01261 endOfInterrupt();
01262
01263
01264 if ( func == NULL ) {
01265 floppy_continuar=1;
01266 }
01267
01268
01269 else {
01270 (*func)();
01271 }
01272
01273 }
01274
01275
01276
01277 void floppy_procesar_buffer(void)
01278 {
01279
01280
01281 if ( ACTUAL_REQUEST != NULL )
01282 return;
01283
01284
01285
01286 if ( (ACTUAL_REQUEST=getrequest(fd0)) == NULL )
01287 return;
01288
01289
01290
01291 leer_escribir_new();
01292 }