📄 ch375.lst
字号:
C51 COMPILER V8.02 CH375 10/19/2008 17:05:12 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE CH375
OBJECT MODULE PLACED IN .\CH375.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\CH375\CH375.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\CH375.lst) OBJECT(
-.\CH375.obj)
line level source
1 /********************************************************************************/
2 /* filename : CH375.h */
3 /* created : xillinx */
4 /* descript : 选择CPU的类型 */
5 /********************************************************************************/
6 #include "../CPU/CPU.h"
7 #include "../CFG/CFG.h"
8 #include "../UART/UART.h"
9 #include "../CH375/CH375.h"
10
11
12 uint08t ch375b_disk_buffer[512*32]; //* 外部RAM数据缓冲区的起始地址
13 uint32t logic_disk_begin; //* 逻辑盘的起始绝对扇区号LBA
14 uint08t logic_section_per_cluster; //* 逻辑盘的每簇扇区数
15 uint08t logic_rsvd_section_num; //* 逻辑盘的保留扇区数
16 uint16t logic_fat_section_num; //* FAT16逻辑盘的FAT表占用的扇区数
17 uint32t logic_lba_begin;
18
19 /********************************************************************************/
20 /* function : ch375b_write_cmd() */
21 /* recension: xillinx */
22 /* descript : CH375写命令函数 */
23 /********************************************************************************/
24 void ch375b_write_cmd(uint08t cmd)
25 { CH375_CMD_PORT=cmd;
26 1 }
27
28 /********************************************************************************/
29 /* function : ch375b_write_dat() */
30 /* recension: xillinx */
31 /* descript : CH375写数据函数 */
32 /********************************************************************************/
33 void ch375b_write_dat(uint08t dat)
34 { CH375_DAT_PORT=dat;
35 1 }
36
37 /********************************************************************************/
38 /* function : ch375b_read_data() */
39 /* recension: xillinx */
40 /* descript : CH375写数据函数 */
41 /********************************************************************************/
42 uint08t ch375b_read_data(void)
43 { return(CH375_DAT_PORT);
44 1 }
45
46 /********************************************************************************/
47 /* function : ch375_delay_ms() */
48 /* recension: xillinx */
49 /* descript : CH375的延时函数 */
50 /********************************************************************************/
51 void ch375_delay_ms(uint08t ms)
52 { uint08t i,j,c;
53 1 for(i=0x0;i<ms;i--)
54 1 { for(j=0x0;j<200;j++)
C51 COMPILER V8.02 CH375 10/19/2008 17:05:12 PAGE 2
55 2 { c+=0x3;
56 3 }
57 2 for(j=0x0;j<200;j++)
58 2 { c+=0x3;
59 3 }
60 2 }
61 1 }
62
63
64 /********************************************************************************/
65 /* function : ch375b_wait_interrupt() */
66 /* recension: xillinx */
67 /* descript : 等待CH375中断并获取状态,返回操作状态 */
68 /********************************************************************************/
69 uint08t ch375b_wait_interrupt(void)
70 { uint16t time=0x2000;
71 1 uint08t status=0x0;
72 1 while((CH375_ISR_PIN)&&(time))
73 1 { //time--;
74 2 }
75 1 ch375b_write_cmd(CMD_GET_STATUS); //* 产生操作完成中断,获取中断状态
76 1 status=ch375b_read_data();
77 1 return status;
78 1 }
79
80 /********************************************************************************/
81 /* function : ch375b_disk_initialize() */
82 /* recension: xillinx */
83 /* descript : BulkOnly传输协议层,被CH375内置了,无需编写单片机程序,RBC/SCSI命令 */
84 /* 层,虽然被CH375内置了,但是要写程序发出命令及收发数据 */
85 /********************************************************************************/
86 uint08t ch375b_disk_initialize( void )
87 { uint08t status;
88 1 ch375b_write_cmd(CMD_GET_STATUS); //* 产生操作完成中断,获取中断状态
89 1 status=ch375b_read_data();
90 1 if(status==USB_INT_DISCONNECT)
91 1 { return status; //* USB设备断开
92 2 }
93 1 ch375b_write_cmd(CMD_DISK_INIT); //* 初始化USB存储器
94 1 status=ch375b_wait_interrupt(); //* 等待中断并获取状态
95 1 if(status!=USB_INT_SUCCESS)
96 1 { return status;
97 2 }
98 1 ch375b_write_cmd(CMD_DISK_SIZE); //* 获取USB存储器的容量
99 1 status=ch375b_wait_interrupt();
100 1 if(status==USB_INT_SUCCESS)
101 1 { return 0x0; //* U盘已经成功初始化
102 2 }
103 1 ch375_delay_ms(250);
104 1 ch375b_write_cmd(CMD_DISK_SIZE); //* 获取USB存储器的容量
105 1 status=ch375b_wait_interrupt();
106 1 if(status==USB_INT_SUCCESS)
107 1 { return 0x0; //* U盘已经成功初始化
108 2 }
109 1 else
110 1 { return status;
111 2 }
112 1 }
113 /********************************************************************************/
114 /* NORMAL普通模式是最早的IDE方式,在硬盘访问时,BIOS和IDE控制器对参数不做任何转换 */
115 /* 该模式支持的最大柱面数为1024, 最大磁头数为16, 最大扇区数为63, 每扇区字节数为 */
116 /* 512,因此支持最大硬盘的容量为: 512x63x16x1024=528MB. */
C51 COMPILER V8.02 CH375 10/19/2008 17:05:12 PAGE 3
117 /* LBA(Logical Block Addressing)逻辑块寻址模式,设置的柱面、磁头、扇区等参数并不 */
118 /* 是实际硬盘的物理参数. 在访问硬盘时,由IDE控制器把由柱面、磁头、扇区等参数确定 */
119 /* 的逻辑地址转换为实际硬盘的物理地址, 在LBA模式下,可设置的最大磁头数为255,其余 */
120 /* 参数与普通模式相同,由此可以计算出可访问的硬盘容量为:512x63x255x1025=8.4GB. */
121 /* 现在新主板的BIOS对INT13进行了扩展,使得LBA能支持100GB以上的硬盘。 */
122 /* LARGE大硬盘模式,在硬盘的柱面超过1024而又不为LBA支持时采用,LARGE模式采用的方 */
123 /* 法是把柱面数除以2,把磁头数乘以2 */
124 /********************************************************************************/
125
126 /********************************************************************************/
127 /* function : ch375b_read_sector() */
128 /* recension: xillinx */
129 /* descript : CH375读取扇区数据 */
130 /********************************************************************************/
131 uint08t ch375b_read_sector(uint32t lba_begin, uint08t section_num, uint08t *out_buffer )
132 { uint16t block_num,all_num=section_num<<0x3;
133 1 uint08t mflag;
134 1 uint16t i=0x0;
135 1 ch375b_write_cmd(CMD_DISK_READ); //* 从USB存储器读数据块
136 1 ch375b_write_dat((uint08t)(lba_begin>>0x00)); //* LBA的最低8位
137 1 ch375b_write_dat((uint08t)(lba_begin>>0x08));
138 1 ch375b_write_dat((uint08t)(lba_begin>>0x10));
139 1 ch375b_write_dat((uint08t)(lba_begin>>0x18)); //* LBA的最高8位
140 1 ch375b_write_dat(section_num); //* 扇区数
141 1 UART_printf("read 1.\r\n");
142 1 for(block_num=0x0;block_num<all_num; block_num++)
143 1 { mflag=ch375b_wait_interrupt(); //* 等待中断并获取状态
144 2 if(mflag!=USB_INT_DISK_READ) //* 等待中断并获取状态,请求数据读出
145 2 { break; //* 返回错误状态
146 3 }
147 2 ch375b_write_cmd(CMD_RD_USB_DATA); //* 从CH375缓冲区读取数据块
148 2 mflag=ch375b_read_data(); //* 后续数据的长度
149 2 UART_printf("block %d-count %bd.\r\n",block_num,mflag);
150 2 while(mflag--)
151 2 { out_buffer[i++]=ch375b_read_data();
152 3 }
153 2 ch375b_write_cmd(CMD_DISK_RD_GO); //* 继续执行USB存储器的读操作
154 2 }
155 1 UART_printf("read 2.\r\n");
156 1 if( block_num>=all_num)
157 1 { mflag=ch375b_wait_interrupt(); //* 等待中断并获取状态
158 2 if(mflag==USB_INT_SUCCESS)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -