170 */ |
170 */ |
171 class TDmac |
171 class TDmac |
172 { |
172 { |
173 friend class DmaChannelMgr; |
173 friend class DmaChannelMgr; |
174 |
174 |
175 // The following two friend declarations will become obsolete once that |
175 // The following friend declaration will become obsolete once header |
176 // functionality is owned and provided by the controller class instead of the |
176 // pool manipulation functionality is owned and provided by the controller |
177 // request class. (TDmac::iFreeHdr could then also be made private.) |
177 // class instead of the request class. |
178 friend TInt DDmaRequest::ExpandDesList(TInt, TInt&, SDmaDesHdr*&, SDmaDesHdr*&); |
178 // (TDmac::iFreeHdr could then also be made private.) |
179 friend void DDmaRequest::FreeDesList(TInt&, SDmaDesHdr*&, SDmaDesHdr*&); |
179 friend class DDmaRequest; |
|
180 |
|
181 friend class TSkelDmac; |
180 |
182 |
181 protected: |
183 protected: |
182 /** Data required for creating a new instance. */ |
184 /** Data required for creating a new instance. */ |
183 struct SCreateInfo |
185 struct SCreateInfo |
184 { |
186 { |
846 private: |
848 private: |
847 virtual void DoQueue(const DDmaRequest& aReq); |
849 virtual void DoQueue(const DDmaRequest& aReq); |
848 virtual void DoCancelAll(); |
850 virtual void DoCancelAll(); |
849 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); |
851 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); |
850 |
852 |
851 private: |
853 protected: |
852 enum {EIdle = 0, ETransferring} iState; |
854 enum {EIdle = 0, ETransferring} iState; |
853 }; |
855 }; |
854 |
856 |
855 |
857 |
856 /** Double-buffer DMA channel. |
858 /** Double-buffer DMA channel. |
862 private: |
864 private: |
863 virtual void DoQueue(const DDmaRequest& aReq); |
865 virtual void DoQueue(const DDmaRequest& aReq); |
864 virtual void DoCancelAll(); |
866 virtual void DoCancelAll(); |
865 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); |
867 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); |
866 |
868 |
867 private: |
869 protected: |
868 enum {EIdle = 0, ETransferring, ETransferringLast} iState; |
870 enum {EIdle = 0, ETransferring, ETransferringLast} iState; |
869 }; |
871 }; |
870 |
872 |
871 |
873 |
872 /** Scatter-gather DMA channel. |
874 /** Scatter-gather DMA channel. |
879 virtual void DoQueue(const DDmaRequest& aReq); |
881 virtual void DoQueue(const DDmaRequest& aReq); |
880 virtual void DoCancelAll(); |
882 virtual void DoCancelAll(); |
881 virtual void DoUnlink(SDmaDesHdr& aHdr); |
883 virtual void DoUnlink(SDmaDesHdr& aHdr); |
882 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); |
884 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aCompletedHdr); |
883 |
885 |
884 private: |
886 protected: |
885 enum {EIdle = 0, ETransferring} iState; |
887 enum {EIdle = 0, ETransferring} iState; |
886 }; |
888 }; |
887 |
889 |
888 |
890 |
889 /** Scatter-gather DMA channel with asymmetric linked-lists. |
891 /** Scatter-gather DMA channel with asymmetric linked-lists. |
892 |
894 |
893 @prototype |
895 @prototype |
894 */ |
896 */ |
895 class TDmaAsymSgChannel : public TDmaChannel |
897 class TDmaAsymSgChannel : public TDmaChannel |
896 { |
898 { |
|
899 public: |
|
900 TDmaAsymSgChannel(); |
|
901 |
897 private: |
902 private: |
898 virtual void DoQueue(const DDmaRequest& aReq); |
903 virtual void DoQueue(const DDmaRequest& aReq); |
899 virtual void DoCancelAll(); |
904 virtual void DoCancelAll(); |
900 virtual void DoUnlink(SDmaDesHdr& aHdr); |
905 virtual void DoUnlink(SDmaDesHdr& aHdr); |
901 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aSrcCompletedHdr, |
906 virtual void DoDfc(const DDmaRequest& aCurReq, SDmaDesHdr*& aSrcCompletedHdr, |
902 SDmaDesHdr*& aDstCompletedHdr); |
907 SDmaDesHdr*& aDstCompletedHdr); |
903 |
908 virtual void SetNullPtr(const DDmaRequest& aReq); |
904 private: |
909 virtual void ResetNullPtr(); |
|
910 |
|
911 protected: |
905 SDmaDesHdr* iSrcCurHdr; // source fragment being transferred or NULL |
912 SDmaDesHdr* iSrcCurHdr; // source fragment being transferred or NULL |
906 SDmaDesHdr** iSrcNullPtr; // Pointer to NULL pointer following last source fragment |
913 SDmaDesHdr** iSrcNullPtr; // Pointer to NULL pointer following last source fragment |
907 SDmaDesHdr* iDstCurHdr; // destination fragment being transferred or NULL |
914 SDmaDesHdr* iDstCurHdr; // destination fragment being transferred or NULL |
908 SDmaDesHdr** iDstNullPtr; // Pointer to NULL pointer following last destination fragment |
915 SDmaDesHdr** iDstNullPtr; // Pointer to NULL pointer following last destination fragment |
909 enum {EIdle = 0, ETransferring} iState; |
916 enum {EIdle = 0, ETransferring} iState; |
|
917 |
|
918 __DMA_DECLARE_VIRTUAL_INVARIANT |
910 }; |
919 }; |
911 |
920 |
912 |
921 |
913 ////////////////////////////////////////////////////////////////////////////// |
922 ////////////////////////////////////////////////////////////////////////////// |
914 |
923 |