📄 zdobject.lst
字号:
614
615 // Send the response message to the device sending this message
616 ZDO_SendEDBindRsp( bindReq->TransSeq, &SrcAddr, Status, bindReq->SecurityUse );
617 }
618 else // Start a new End Device Bind
619 {
620 // Copy the info
621 ZDO_EDBind = osal_mem_alloc( sizeof( ZDO_EDBind_t ) );
622 if ( ZDO_EDBind )
623 {
624 osal_memcpy( &(ZDO_EDBind->SrcAddr), &SrcAddr, sizeof( zAddrType_t ) );
625 ZDO_EDBind->LocalCoordinator = bindReq->localCoordinator;
626 ZDO_EDBind->epIntf = bindReq->endpoint;
627 ZDO_EDBind->ProfileID = bindReq->profileID;
628 ZDO_EDBind->SrcTransSeq = bindReq->TransSeq;
629
630 ZDO_EDBind->numInClusters = bindReq->numInClusters;
631 if ( bindReq->numInClusters )
632 {
633 ZDO_EDBind->inClusters = osal_mem_alloc( (short)(bindReq->numInClusters * sizeof(uint16)) );
634 if ( ZDO_EDBind->inClusters )
635 {
636 osal_memcpy( ZDO_EDBind->inClusters, bindReq->inClusters, (bindReq->numInClusters * sizeof( uint16 )) );
637 }
638 else
639 {
640 // Force no clusters
641 ZDO_EDBind->numInClusters = 0;
642 }
643 }
644 else
645 ZDO_EDBind->inClusters = NULL;
646
647 ZDO_EDBind->numOutClusters = bindReq->numOutClusters;
648 if ( bindReq->numOutClusters )
649 {
650 ZDO_EDBind->outClusters = osal_mem_alloc( (short)(bindReq->numOutClusters*sizeof(uint16)) );
651 if ( ZDO_EDBind->outClusters )
652 {
653 osal_memcpy( ZDO_EDBind->outClusters, bindReq->outClusters, (bindReq->numOutClusters * sizeof( uint16 )) );
654 }
655 else
656 {
657 ZDO_EDBind->numOutClusters = 0;
658 }
659 }
660 else
661 ZDO_EDBind->outClusters = NULL;
662
663 ZDO_EDBind->SecurityUse = bindReq->SecurityUse;
664 ZDO_EDBind->status = ZDP_TIMEOUT;
665
666 // Setup the timer
667 APS_SetEndDeviceBindTimeout( AIB_MaxBindingTime, ZDO_EndDeviceTimeoutCB );
668 }
669 }
670 }
671 #endif // REFLECTOR
672
673 /*********************************************************************
674 * Utility functions
675 */
676
677 /*********************************************************************
678 * @fn ZDO_CreateAlignedUINT16List
679 *
680 * @brief Creates a list of cluster IDs that is guaranteed to be aligned.
681 * according to the needs of the target. If thre device is running
682 * Protocol version 1.0 the incoming buffer will have only a single
683 * byte for the cluster ID.
684 *
685 * Depends on the malloc taking care of alignment.
686 *
687 * When cluster ID went to 16 bits alignment for cluster IDs became
688 * an issue.
689 *
690 * @param num - number of entries in list
691 * @param buf - pointer to list
692 *
693 * @return pointer to aligned list. Null if can't allocate memory.
694 * Caller's responsibility to free memory.
695 */
\ In segment BANKED_CODE, align 1, keep-with-next
696 static uint16 *ZDO_CreateAlignedUINT16List(uint8 num, uint8 *buf)
\ ??ZDO_CreateAlignedUINT16List:
697 {
\ 000000 74F2 MOV A,#-0xe
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 14
\ 000005 ; Auto size: 0
\ 000005 89.. MOV ?V0 + 2,R1
\ 000007 EA MOV A,R2
\ 000008 FE MOV R6,A
\ 000009 EB MOV A,R3
\ 00000A FF MOV R7,A
698 uint16 *ptr;
699
700 if ((ptr=osal_mem_alloc((short)(num*sizeof(uint16))))) {
\ 00000B ; Setup parameters for call to function osal_mem_alloc
\ 00000B E9 MOV A,R1
\ 00000C C3 CLR C
\ 00000D 33 RLC A
\ 00000E FA MOV R2,A
\ 00000F E4 CLR A
\ 000010 33 RLC A
\ 000011 FB MOV R3,A
\ 000012 90.... MOV DPTR,#(osal_mem_alloc & 0xffff)
\ 000015 74.. MOV A,#((osal_mem_alloc >> 16) & 0xff)
\ 000017 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 00001A 8A.. MOV ?V0 + 0,R2
\ 00001C 8B.. MOV ?V0 + 1,R3
\ 00001E EA MOV A,R2
\ 00001F 7001 JNZ ??ZDO_CreateAlignedUINT16List_1
\ 000021 EB MOV A,R3
\ ??ZDO_CreateAlignedUINT16List_1:
\ 000022 605D JZ ??ZDO_CreateAlignedUINT16List_2
701 uint8 i, ubyte, inc;
702
703 inc = (ZB_PROT_V1_1 == NLME_GetProtocolVersion()) ? 2 : 1;
\ 000024 ; Setup parameters for call to function NLME_GetProtocolVersion
\ 000024 90.... MOV DPTR,#(NLME_GetProtocolVersion & 0xffff)
\ 000027 74.. MOV A,#((NLME_GetProtocolVersion >> 16) & 0xff)
\ 000029 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 00002C E9 MOV A,R1
\ 00002D 6402 XRL A,#0x2
\ 00002F 7004 JNZ ??ZDO_CreateAlignedUINT16List_3
\ 000031 7B02 MOV R3,#0x2
\ 000033 8002 SJMP ??ZDO_CreateAlignedUINT16List_4
\ ??ZDO_CreateAlignedUINT16List_3:
\ 000035 7B01 MOV R3,#0x1
704
705 for (i=0; i<num; ++i) {
\ ??ZDO_CreateAlignedUINT16List_4:
\ 000037 7A00 MOV R2,#0x0
\ 000039 8031 SJMP ??ZDO_CreateAlignedUINT16List_5
706 // set upper byte to 0 if we're talking Version 1.0. otherwise
707 // the buffer contains 16 bit cluster IDs.
708 ubyte = (2 == inc) ? buf[1] : 0;
\ ??ZDO_CreateAlignedUINT16List_6:
\ 00003B 75..00 MOV ?V0 + 3,#0x0
709 ptr[i] = BUILD_UINT16(buf[0], ubyte);
\ ??ZDO_CreateAlignedUINT16List_7:
\ 00003E 8E82 MOV DPL,R6
\ 000040 8F83 MOV DPH,R7
\ 000042 E0 MOVX A,@DPTR
\ 000043 FC MOV R4,A
\ 000044 E4 CLR A
\ 000045 2C ADD A,R4
\ 000046 E5.. MOV A,?V0 + 3
\ 000048 3400 ADDC A,#0x0
\ 00004A FD MOV R5,A
\ 00004B EA MOV A,R2
\ 00004C C3 CLR C
\ 00004D 33 RLC A
\ 00004E F8 MOV R0,A
\ 00004F E4 CLR A
\ 000050 33 RLC A
\ 000051 F9 MOV R1,A
\ 000052 E5.. MOV A,?V0 + 0
\ 000054 28 ADD A,R0
\ 000055 F582 MOV DPL,A
\ 000057 E5.. MOV A,?V0 + 1
\ 000059 39 ADDC A,R1
\ 00005A F583 MOV DPH,A
\ 00005C EC MOV A,R4
\ 00005D F0 MOVX @DPTR,A
\ 00005E A3 INC DPTR
\ 00005F ED MOV A,R5
\ 000060 F0 MOVX @DPTR,A
710 buf += inc;
\ 000061 8B.. MOV ?V0 + 4,R3
\ 000063 EE MOV A,R6
\ 000064 25.. ADD A,?V0 + 4
\ 000066 FE MOV R6,A
\ 000067 EF MOV A,R7
\ 000068 3400 ADDC A,#0x0
\ 00006A FF MOV R7,A
\ 00006B 0A INC R2
\ ??ZDO_CreateAlignedUINT16List_5:
\ 00006C EA MOV A,R2
\ 00006D C3 CLR C
\ 00006E 95.. SUBB A,?V0 + 2
\ 000070 500F JNC ??ZDO_CreateAlignedUINT16List_2
\ 000072 7402 MOV A,#0x2
\ 000074 6B XRL A,R3
\ 000075 70C4 JNZ ??ZDO_CreateAlignedUINT16List_6
\ 000077 8E82 MOV DPL,R6
\ 000079 8F83 MOV DPH,R7
\ 00007B A3 INC DPTR
\ 00007C E0 MOVX A,@DPTR
\ 00007D F5.. MOV ?V0 + 3,A
\ 00007F 80BD SJMP ??ZDO_CreateAlignedUINT16List_7
711 }
712 }
713
714 return ptr;
\ ??ZDO_CreateAlignedUINT16List_2:
\ 000081 AA.. MOV R2,?V0 + 0
\ 000083 AB.. MOV R3,?V0 + 1
\ 000085 REQUIRE ?Subroutine24
\ 000085 ; // Fall through to label ?Subroutine24
715 }
\ In segment BANKED_CODE, align 1, keep-with-next
\ ?Subroutine24:
\ 000000 7F06 MOV R7,#0x6
\ 000002 02.... LJMP ?BANKED_LEAVE_XDATA
716
717 /*********************************************************************
718 * @fn ZDO_CompareByteLists
719 *
720 * @brief Compares two lists for matches.
721 *
722 * @param ACnt - number of entries in list A
723 * @param AList - List A
724 * @param BCnt - number of entries in list B
725 * @param BList - List B
726 *
727 * @return true if a match is found
728 */
\ In segment BANKED_CODE, align 1, keep-with-next
729 byte ZDO_AnyClusterMatches( byte ACnt, uint16 *AList, byte BCnt, uint16 *BList )
\ ZDO_AnyClusterMatches:
730 {
\ 000000 74F4 MOV A,#-0xc
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 12
\ 000005 ; Auto size: 0
\ 000005 89.. MOV ?V0 + 0,R1
\ 000007 8C.. MOV ?V0 + 1,R4
\ 000009 740C MOV A,#0xc
\ 00000B 12.... LCALL ?XSTACK_DISP0_8
\ 00000E 12.... LCALL ?Subroutine13 & 0xFFFF
731 byte x, y;
732
733 for ( x = 0; x < ACnt; x++ )
\ ??CrossCallReturnLabel_32:
\ 000011 75..00 MOV ?V0 + 3,#0x0
\ 000014 8002 SJMP ??ZDO_AnyClusterMatches_0
\ ??ZDO_AnyClusterMatches_1:
\ 000016 05.. INC ?V0 + 3
\ ??ZDO_AnyClusterMatches_0:
\ 000018 E5.. MOV A,?V0 + 3
\ 00001A C3 CLR C
\ 00001B 95.. SUBB A,?V0 + 0
\ 00001D 5040 JNC ??ZDO_AnyClusterMatches_2
734 {
735 for ( y = 0; y < BCnt; y++ )
\ 00001F 75..00 MOV ?V0 + 2,#0x0
\ 000022 8002 SJMP ??ZDO_AnyClusterMatches_3
\
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -