⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap_9.lst

📁 采用PDIUSBD12开发的USB总线与429总线数据转换的单片机固件程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 235   1      	unsigned char endp, txdat[2];
 236   1      	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 237   1      	unsigned char c;
 238   1      
 239   1      	if (bRecipient == USB_RECIPIENT_DEVICE) {
 240   2      		if(bEPPflags.bits.remote_wakeup == 1)
 241   2      			txdat[0] = 3;//支持远程唤醒,自供电
C51 COMPILER V6.12  CHAP_9                                                                 12/16/2004 15:21:55 PAGE 5   

 242   2      		else
 243   2      			txdat[0] = 1;//不支持远程唤醒,自供电
 244   2      		txdat[1]=0;
 245   2      		single_transmit(txdat, 2);
 246   2      	} else if (bRecipient == USB_RECIPIENT_INTERFACE) {
 247   2      		txdat[0]=0;
 248   2      		txdat[1]=0;
 249   2      		single_transmit(txdat, 2);
 250   2      	} else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
 251   2      		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 252   2      		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 253   2      			c = D12_SelectEndpoint(endp*2 + 1);	/* Control-in */
 254   2      		else
 255   2      			c = D12_SelectEndpoint(endp*2);	/* Control-out */
 256   2      		if(c & D12_STALL)
 257   2      			txdat[0] = 1;
 258   2      		else
 259   2      			txdat[0] = 0;
 260   2      		txdat[1] = 0;
 261   2      		single_transmit(txdat, 2);
 262   2      	} else
 263   1      		stall_ep0();
 264   1      }
 265          //清除特性
 266          void clear_feature(void)
 267          {
 268   1      	unsigned char endp;
 269   1      	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 270   1      
 271   1      	if (bRecipient == USB_RECIPIENT_DEVICE
 272   1      		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
 273   2      		DISABLE;
 274   2      		bEPPflags.bits.remote_wakeup = 0;
 275   2      		ENABLE;
 276   2      		single_transmit(0, 0);
 277   2      	}
 278   1      	else if (bRecipient == USB_RECIPIENT_ENDPOINT
 279   1      		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
 280   2      		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 281   2      		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 282   2      			/* clear TX stall for IN on EPn. */
 283   2      			D12_SetEndpointStatus(endp*2 + 1, 0);
 284   2      		else
 285   2      			/* clear RX stall for OUT on EPn. */
 286   2      			D12_SetEndpointStatus(endp*2, 0);
 287   2      		single_transmit(0, 0);
 288   2      	} else
 289   1      		stall_ep0();
 290   1      }
 291          
 292          //设置特性
 293          void set_feature(void)
 294          {
 295   1      	unsigned char endp;
 296   1      	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 297   1      
 298   1      	if (bRecipient == USB_RECIPIENT_DEVICE
 299   1      		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
 300   2      		DISABLE;
 301   2      		bEPPflags.bits.remote_wakeup = 1;
 302   2      		ENABLE;
 303   2      		single_transmit(0, 0);
C51 COMPILER V6.12  CHAP_9                                                                 12/16/2004 15:21:55 PAGE 6   

 304   2      	}
 305   1      	else if (bRecipient == USB_RECIPIENT_ENDPOINT
 306   1      		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
 307   2      		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 308   2      		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 309   2      			/* clear TX stall for IN on EPn. */
 310   2      			D12_SetEndpointStatus(endp*2 + 1, 1);
 311   2      		else
 312   2      			/* clear RX stall for OUT on EPn. */
 313   2      			D12_SetEndpointStatus(endp*2, 1);
 314   2      		single_transmit(0, 0);
 315   2      	} else
 316   1      		stall_ep0();
 317   1      }
 318          
 319          //设置地址
 320          void set_address(void)
 321          {
 322   1      	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
 323   1      		DEVICE_ADDRESS_MASK), 1);
 324   1      	single_transmit(0, 0);
 325   1      }
 326          
 327          //获取描述符
 328          void get_descriptor(void)
 329          {
 330   1      	unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
 331   1      
 332   1      	if (bDescriptor == 0x01)//USB_DEVICE_DESCRIPTOR_TYPE)
 333   1          {
 334   2      		code_transmit((unsigned char code *)&DeviceDescr, 18);//sizeof(USB_DEVICE_DESCRIPTOR));
 335   2      	}
 336   1          else if (bDescriptor ==0x02)// USB_CONFIGURATION_DESCRIPTOR_TYPE)
 337   1          {
 338   2      		if (ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
 339   2      			ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;
 340   2      
 341   2      		code_transmit((unsigned char code *)&ConfigDescr, ControlData.DeviceRequest.wLength);
 342   2      		//code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
 343   2      	}
 344   1          else
 345   1      		stall_ep0();
 346   1      }
 347          
 348          //获取配置
 349          void get_configuration(void)
 350          {
 351   1      	unsigned char c = bEPPflags.bits.configuration;
 352   1      
 353   1      	single_transmit(&c, 1);
 354   1      }
 355          
 356          //设置配置
 357          void set_configuration(void)
 358          {
 359   1      	if (ControlData.DeviceRequest.wValue == 0) {
 360   2      		/* put device in unconfigured state */
 361   2      		single_transmit(0, 0);
 362   2      		DISABLE;
 363   2      		bEPPflags.bits.configuration = 0;
 364   2      		ENABLE;
 365   2      		init_unconfig();
C51 COMPILER V6.12  CHAP_9                                                                 12/16/2004 15:21:55 PAGE 7   

 366   2      	} else if (ControlData.DeviceRequest.wValue == 1) {
 367   2      		/* Configure device */
 368   2      		single_transmit(0, 0);
 369   2      
 370   2      		init_unconfig();
 371   2      		init_config();
 372   2      
 373   2      		DISABLE;
 374   2      		bEPPflags.bits.configuration = 1;
 375   2      		ENABLE;
 376   2      	} else
 377   1      		stall_ep0();
 378   1      }
 379          
 380          //获取接口信息
 381          void get_interface(void)
 382          {
 383   1      	unsigned char txdat = 0;        /* Only/Current interface = 0 */
 384   1      	single_transmit(&txdat, 1);
 385   1      }
 386          
 387          //设置接口
 388          void set_interface(void)
 389          {
 390   1      	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
 391   1      		single_transmit(0, 0);
 392   1      	else
 393   1      		stall_ep0();
 394   1      }
 395          
 396           /*
 397          //获取固件版本号
 398          void get_firmware_version()
 399          {
 400          	unsigned char i;
 401          
 402          	i = 0x30; // firmware version number
 403          	single_transmit((unsigned char *)&i, 1);
 404          }
 405          
 406          //获取端点2缓冲区大小
 407          void get_buffer_size()
 408          {
 409          	unsigned char i[4];
 410          
 411          	i[0] = EP2_PACKET_SIZE;
 412          	i[1] = 0;
 413          	i[2] = 0;
 414          	i[3] = 0;
 415          	single_transmit((unsigned char *)&i, 4);
 416          }
 417          
 418          //厂商请求处理
 419          void read_write_register(void)
 420          {
 421          //	unsigned char i;
 422          
 423          	if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 424          		if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
 425          			ControlData.DeviceRequest.wValue == 0 &&
 426          			ControlData.DeviceRequest.wLength == 1)
 427          			get_firmware_version();
C51 COMPILER V6.12  CHAP_9                                                                 12/16/2004 15:21:55 PAGE 8   

 428          		else  if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE &&
 429          			ControlData.DeviceRequest.wValue == 0 &&
 430          			ControlData.DeviceRequest.wLength == 4)
 431          			get_buffer_size();
 432          		else
 433          			stall_ep0();
 434          
 435          	}	// if read register
 436          	else{
 437          		if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
 438          			ControlData.DeviceRequest.wValue == 0 &&
 439          			ControlData.DeviceRequest.wLength == 6)
 440          			{
 441          				if(ControlData.dataBuffer[5]==0x81)
 442          					D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);
 443          				single_transmit(0, 0);
 444          			}
 445          		else
 446          			stall_ep0();
 447          	}	// if write register
 448          }
 449           */
 450          
 451          
 452          
 453          
 454          
 455          
C51 COMPILER V6.12  CHAP_9                                                                 12/16/2004 15:21:55 PAGE 9   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


T0 . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B4H  1
AC . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00D6H  1
T1 . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B5H  1
EA . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00AFH  1
ULONG. . . . . . . . . . . . . . . . .  TYPEDEF  -----  U_LONG   -----  4
stall_ep0. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
USB_STRING_DESCRIPTOR. . . . . . . . .  TYPEDEF  -----  STRUCT   -----  3
  bLength. . . . . . . . . . . . . . .  MEMBER   -----  U_CHAR   0000H  1
  bDescriptorType. . . . . . . . . . .  MEMBER   -----  U_CHAR   0001H  1
  bString. . . . . . . . . . . . . . .  MEMBER   -----  ARRAY    0002H  1
InterfaceDescr . . . . . . . . . . . .  PUBLIC   CODE   STRUCT   007BH  9
USB_CONFIGURATION_DESCRIPTOR . . . . .  TYPEDEF  -----  STRUCT   -----  9
  bLength. . . . . . . . . . . . . . .  MEMBER   -----  U_CHAR   0000H  1
  bDescriptorType. . . . . . . . . . .  MEMBER   -----  U_CHAR   0001H  1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -