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

📄 kdioctl.c

📁 WinCE5.0BSP for Renesas SH7770
💻 C
字号:
//
//  Copyright(C) Renesas Technology Corp. 2005. All rights reserved.
//
//  generic IOCTLs for ITS-DS7 Ver.0.8.0
//
//  FILE      : kdioctl.c
//  CREATED   : 2005.08.10
//  MODIFIED  : 
//  AUTHOR    : Renesas Technology Corp.
//  HARDWARE  : RENESAS ITS-DS7
//  HISTORY   : 
//              2005.08.10
//              - Created release code.
//                (based on SMDK2410/MAINSTONEII for WCE5.0)
//

//
// KD Ioctl routines
//
#include "windows.h"
#include "platform.h"
#include <pkfuncs.h>

#if defined(SHx) 

#define RWE_DISABLE     0x0    // Disables BP
#define RWE_READ        0x1
#define RWE_WRITE       0x2
#define RWE_READWRITE   0x3

#define CON_DISABLE     0x0    // Disables BP
#define CON_INST        0x1
#define CON_DATA        0x2
#define CON_BOTH        0x3

#define FULL_ADDR_ENABLE 0x0
#define ASID_DISABLE     0x4
typedef struct _BREAK_BUS_CYCLE *PBREAK_BUS_CYCLE;
typedef struct _BREAK_BUS_CYCLE {
    USHORT      Size    : 2;
    USHORT      R_WSel  : 2;
    USHORT      I_DSel  : 2;
    USHORT      Pad     : 10;
} BREAK_BUS_CYCLE;

#if defined(SHx)

//
// User Break Controller memory-mapped addresses
//
#if SH4
#define UBCBarA  0xFF200000        // 32 bit Break Address A
#define UBCBamrA 0xFF200004        // 8 bit  Break Address Mask A
#define UBCBbrA  0xFF200008        // 16 bit Break Bus Cycle A
#define UBCBasrA 0xFF000014        // 8 bit  Break ASID A
#define UBCBarB  0xFF20000C       // 32 bit Break Address B
#define UBCBamrB 0xFF200010       // 8 bit  Break Address Mask B
#define UBCBbrB  0xFF200014       // 16 bit Break Bus Cycle A
#define UBCBasrB 0xFF000018       // 8 bit  Break ASID B
#define UBCBdrB  0xFF200018       // 32 bit Break Data B
#define UBCBdmrB 0xFF20001C       // 32 bit Break Data Mask B
#define UBCBrcr  0xFF200020       // 16 bit Break Control Register
#else
#define UBCBarA    0xffffffb0
#define UBCBamrA   0xffffffb4
#define UBCBbrA    0xffffffb8
#define UBCBasrA   0xffffffe4
#define UBCBarB    0xffffffa0
#define UBCBamrB   0xffffffa4
#define UBCBbrB    0xffffffa8
#define UBCBasrB   0xffffffe8
#define UBCBdrB    0xffffff90
#define UBCBdmrB   0xffffff94
#define UBCBrcr    0xffffff98
#endif
#endif

#define CLEARUBCA \
			    WRITE_REGISTER_ULONG(UBCBarA,  0); \
				WRITE_REGISTER_USHORT(UBCBrcr, 0); \
			    WRITE_REGISTER_UCHAR(UBCBamrA, 0); \
			    WRITE_REGISTER_USHORT(UBCBbrA, 0); \
			    WRITE_REGISTER_UCHAR(UBCBasrA, 0); 

#define CLEARUBCB \
			    WRITE_REGISTER_ULONG(UBCBarB,  0); \
				WRITE_REGISTER_USHORT(UBCBrcr, 0); \
			    WRITE_REGISTER_UCHAR(UBCBamrB, 0); \
			    WRITE_REGISTER_USHORT(UBCBbrB, 0); \
			    WRITE_REGISTER_UCHAR(UBCBasrB, 0); 
			    
USHORT BreakBusCycle = 0;

BOOL OEMKDIoControl( DWORD dwIoControlCode, LPVOID lpBuf, DWORD nBufSize)
{
	switch(dwIoControlCode) {
	case KD_IOCTL_INIT:
		CLEARUBCA;
		CLEARUBCB;
		return TRUE;
	case KD_IOCTL_SET_CBP:
	case KD_IOCTL_CLEAR_CBP:
	case KD_IOCTL_ENUM_CBP:
		break;
	case KD_IOCTL_QUERY_CBP:
		((PKD_BPINFO)lpBuf)->ulCount = 0;
		return TRUE;
	case KD_IOCTL_SET_DBP:
		{
			PBREAK_BUS_CYCLE pbbc = (PBREAK_BUS_CYCLE)&BreakBusCycle;
			if (!READ_REGISTER_ULONG(UBCBarA)) {
				BreakBusCycle = 0;
				pbbc->R_WSel = RWE_WRITE;
				pbbc->I_DSel = CON_DATA;
			    WRITE_REGISTER_ULONG(UBCBarA,  ((PKD_BPINFO)lpBuf)->ulAddress);
				WRITE_REGISTER_USHORT(UBCBrcr, 0);
			    WRITE_REGISTER_UCHAR(UBCBamrA, FULL_ADDR_ENABLE | ASID_DISABLE);
			    WRITE_REGISTER_USHORT(UBCBbrA, BreakBusCycle); 
			    WRITE_REGISTER_UCHAR(UBCBasrA, 0);
				((PKD_BPINFO)lpBuf)->ulHandle = 1;
				return TRUE;
			} 
			if (!READ_REGISTER_ULONG(UBCBarB)) {
				BreakBusCycle = 0;
				pbbc->R_WSel = RWE_WRITE;
				pbbc->I_DSel = CON_DATA;
			    WRITE_REGISTER_ULONG(UBCBarB,  ((PKD_BPINFO)lpBuf)->ulAddress);
				WRITE_REGISTER_USHORT(UBCBrcr, 0);
			    WRITE_REGISTER_UCHAR(UBCBamrB, FULL_ADDR_ENABLE | ASID_DISABLE);
			    WRITE_REGISTER_USHORT(UBCBbrB, BreakBusCycle); 
			    WRITE_REGISTER_UCHAR(UBCBasrB, 0);
				((PKD_BPINFO)lpBuf)->ulHandle = 2;
				return TRUE;
			}
		}
		break;
	case KD_IOCTL_CLEAR_DBP:
		if (((PKD_BPINFO)lpBuf)->ulHandle == 1) {
			CLEARUBCA
			return TRUE;
		} 
		if (((PKD_BPINFO)lpBuf)->ulHandle == 2) {
			CLEARUBCB
			return TRUE;
		} 
		break;
	case KD_IOCTL_QUERY_DBP:
		((PKD_BPINFO)lpBuf)->ulCount = 2;
		return TRUE;
	case KD_IOCTL_ENUM_DBP:
		break;
	case KD_IOCTL_MAP_EXCEPTION:
		if (((PKD_EXCEPTION_INFO)lpBuf)->ulExceptionCode == 0x80000113) {
			((PKD_EXCEPTION_INFO)lpBuf)->ulExceptionCode = STATUS_BREAKPOINT;
			return TRUE;
		}
		break;		
    case KD_IOCTL_DMPGEN_START:
        // Start of error report dump file generation into reserved memory
    case KD_IOCTL_DMPGEN_END:
        // End of error report dump file generation into reserved memory
        break;
	case KD_IOCTL_RESET:
        //*((volatile DWORD *) (CPU_BASE + CPU_RR)) |= 1;
        return TRUE;
	default:
		break;
	}
	return FALSE;
}

#endif

⌨️ 快捷键说明

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