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

📄 callout_debug_8260.s

📁 qnx powerpc MPC8245的 BSP源文件
💻 S
字号:
#  # Copyright 2007, QNX Software Systems. #  # Licensed under the Apache License, Version 2.0 (the "License"). You # may not reproduce, modify or distribute this software except in # compliance with the License. You may obtain a copy of the License # at: http://www.apache.org/licenses/LICENSE-2.0 #  # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTIES OF ANY KIND, either express or implied.# # This file may contain contributions from others, either as # contributors under the License or as licensors under other terms.  # Please review this entire file for other proprietary rights or license # notices, as well as the QNX Development Suite License Guide at # http://licensing.qnx.com/license-guide/ for other information.# # An entry point for a hardware kernel callout.# It may be called by an interrupt handler.# This code MUST be position independant.#	.include "callout.ah"	.include "ppc/util.ah"			.extern ptrTxBD 	.extern ptrRxBD 	.extern immr_paddr	.extern cpm_offset	p_txbdtbl:	.long	24p_rxbdtbl:	.long	24patch_debug_tx:	stwu    %r1,-32(%r1)	mflr    %r0	stw     %r31,28(%r1)	stw     %r0,36(%r1)	# get device port	lwz		%r8,DDI_BASE(%r7)	mulli	%r8,%r8,4	add		%r6,%r6,%r8	# save TxBDtbl address	add		%r7,%r3,%r6	lis		%r9,ptrTxBD@ha		la		%r9,ptrTxBD@l(%r9)	add		%r9,%r9,%r8	lwz		%r8,0(%r9)	stw		%r8,0(%r7)			# patch the routine to use the correct base 	add		%r31,%r3,%r5	sth		%r6,2(%r31)		# Map in CPM memory	mr      %r8,%r4	loadwz  %r4,immr_paddr	loadwz  %r3,cpm_offset	add		%r4,%r4,%r3	loadi   %r3,0x14000	bl      callout_io_map	# Offset is virtual - physical	loadwz	%r4, immr_paddr	loadwz	%r7, cpm_offset	add		%r4, %r4, %r7	subf	%r4, %r4, %r3	# Patch Virt-Phys offset	sth		%r4, 18(%r31)	srwi	%r4, %r4, 16	sth		%r4, 14(%r31)	# patch IMMR base	sth     %r3,10(%r31)	srwi    %r3,%r3,16	sth     %r3,6(%r31)	mr      %r4,%r8	lwz     %r0,36(%r1)	mtlr    %r0	lwz     %r31,28(%r1)	addi    %r1,%r1,32	blrpatch_debug_rx:	stwu    %r1,-32(%r1)	mflr    %r0	stw     %r31,28(%r1)	stw     %r0,36(%r1)	# get device port	lwz		%r8,DDI_BASE(%r7)	mulli	%r8,%r8,4	add		%r6,%r6,%r8	# save RxBDtbl address	add		%r7,%r3,%r6	lis		%r9,ptrRxBD@ha		la		%r9,ptrRxBD@l(%r9)	add		%r9,%r9,%r8	lwz		%r8,0(%r9)	stw		%r8,0(%r7)			# patch the routine to use the correct base 	add		%r31,%r3,%r5	sth		%r6,2(%r31)	# Map in CPM memory	mr      %r8,%r4	loadwz  %r4,immr_paddr	loadwz  %r3,cpm_offset	add		%r4,%r4,%r3	loadi   %r3,0x14000	bl      callout_io_map	# Offset is virtual - physical	loadwz	%r4, immr_paddr	loadwz	%r7, cpm_offset	add		%r4, %r4, %r7	subf	%r4, %r4, %r3	# patch phys-virt offset	sth		%r4, 18(%r31)	srwi	%r4, %r4, 16	sth		%r4, 14(%r31)	# patch IMMR base	sth     %r3,10(%r31)	srwi    %r3,%r3,16	sth     %r3,6(%r31)	mr      %r4,%r8	lwz     %r0,36(%r1)	mtlr    %r0	lwz     %r31,28(%r1)	addi    %r1,%r1,32	blr## void display_output(struct syspage_entry *sysp, char c)## Display debug messages from kdebug or the kernel.#CALLOUT_START	display_char_8260cpm, p_txbdtbl, patch_debug_tx	li		%r5,0x1234			# get p_txbd offset address (patched)	lis     %r9,0x1234			# get IMMR base address (patched)	ori     %r9,%r9,0x5678	lis		%r10,0x1234			# get virtual to physical translation	ori		%r10,%r10,0x5678	# Check and see if the cpu requires the address space bit cleared	lhz		%r11,SYSPAGE_PPC_KERINFO(%r3)	add		%r11,%r11,%r3	lwz		%r11,KERINFO_TS_CLEAR(%r11)	# Disable interrupt as well	bitset 	%r11, %r11, PPC_MSR_EE	mfmsr	%r8	andc	%r11, %r8, %r11	mtmsr	%r11	isync	add		%r3, %r3, %r5		# p_txbd	lwz		%r11,0(%r3)			# ptrBDHead	lwz		%r7,0(%r11)			# ptrBD	rlwinm	%r9,%r9,0,0,15	addi	%r9,%r9,PPC8260_IMMR_OFF_DPRAM1			add		%r7,%r7,%r9		# Wait for the TxBuff ready1:	lhz		%r6,0(%r7)	andi.	%r5,%r6,PPC8260CPM_UART_TXBD_R	bne		1b	# Transmit	lwz		%r5,PPC8260CPM_BD_POINTER(%r7)	# Convert phys addr to virtual	add		%r5, %r5, %r10	stb		%r4,0(%r5)		li		%r4,1	sth		%r4,PPC8260CPM_BD_COUNT(%r7)	ori		%r6,%r6,PPC8260CPM_UART_TXBD_R	sth		%r6,0(%r7)		# Change BD counter	andi.	%r6,%r6,PPC8260CPM_UART_TXBD_W	beq		1f	addi	%r7,%r11,PPC8260CPM_BD_SIZE	b		2f1:	addi	%r7,%r7,PPC8260CPM_BD_SIZE2:		sub		%r7,%r7,%r9					#relative	stw		%r7,0(%r11)	mtmsr	%r8	blr		CALLOUT_END		display_char_8260cpm		## int poll_key( volatile struct syspage_entry *)## return a key value, or -1 if no key is available (for kdebug use)#CALLOUT_START	poll_key_8260cpm, p_rxbdtbl, patch_debug_rx	li		%r5,0x1234			# get p_rxbd address offset (patched)	lis     %r9,0x1234			# get IMMR base address (patched)	ori     %r9,%r9,0x5678	lis		%r10,0x1234			# get virtual to physical translation	ori		%r10,%r10,0x5678		# Check and see if the cpu requires the TS bit cleared	lhz		%r11,SYSPAGE_PPC_KERINFO(%r3)	add		%r11,%r11,%r3	lwz		%r11,KERINFO_TS_CLEAR(%r11)	# Also disable interrupt	bitset 	%r11, %r11, PPC_MSR_EE	mfmsr	%r8	andc	%r11, %r8, %r11	mtmsr	%r11	isync	add		%r3, %r3, %r5		# p_rxbd	lwz		%r11,0(%r3)			# ptrBDHead	lwz		%r7,0(%r11)			# ptrBD	rlwinm	%r9,%r9,0,0,15	addi	%r9,%r9,PPC8260_IMMR_OFF_DPRAM1			add		%r7,%r7,%r9		# Anything available?	lhz		%r6,0(%r7)	andi.	%r5,%r6,PPC8260CPM_UART_RXBD_E	beq		1f	# Empty		li		%r3,-1	mtmsr	%r8	blr1:			# Receive	lwz		%r5,PPC8260CPM_BD_POINTER(%r7)	# Convert physical addr to virtual	add		%r5, %r5, %r10	lbz		%r4,0(%r5)			ori		%r6,%r6,PPC8260CPM_UART_RXBD_E	sth		%r6,0(%r7)		# Change BD counter	andi.	%r6,%r6,PPC8260CPM_UART_RXBD_W	beq		1f	addi	%r7,%r11,PPC8260CPM_BD_SIZE	b		2f1:	addi	%r7,%r7,PPC8CPM_BD_SIZE2:		sub		%r7,%r7,%r9					#relative	stw		%r7,0(%r11)	mr		%r3,%r4	mtmsr	%r8	blr		CALLOUT_END		poll_key_8260cpm		## int break_detect(volatile struct syspage_entry *)## return 1 if a break condition is detected, 0 otherwise#CALLOUT_START	break_detect_8260cpm, p_rxbdtbl, patch_debug_rx	li		%r5,0x1234			# get p_rxbd address offset (patched)	lis     %r9,0x1234			# get IMMR base address (patched)	ori     %r9,%r9,0x5678	lis		%r10,0x1234			# get virtual to physical translation	ori		%r10,%r10,0x5678		# Check and see if the cpu requires the TS bit cleared	lhz		%r11,SYSPAGE_PPC_KERINFO(%r3)	add		%r11,%r11,%r3	lwz		%r11,KERINFO_TS_CLEAR(%r11)	# Also disable interrupt	bitset 	%r11, %r11, PPC_MSR_EE	mfmsr	%r8	andc	%r11, %r8, %r11	mtmsr	%r11	isync	add		%r3, %r3, %r5		# p_rxbd	lwz		%r11,0(%r3)			# ptrBDHead	lwz		%r7,0(%r11)			# ptrBD	rlwinm	%r9,%r9,0,0,15	addi	%r9,%r9,PPC8260_IMMR_OFF_DPRAM1			add		%r7,%r7,%r9		# Break?	lhz		%r6,0(%r7)	andi.	%r5,%r6,PPC8260CPM_UART_RXBD_BR	bne		1f	# No break	li		%r3,0	mtmsr	%r8	blr1:	# Clear the break bit	andi. 	%r5,%r6,PPC8260CPM_UART_RXBD_W	sth		%r5,0(%r7)			# Change BD counter	andi.	%r6,%r6,PPC8260CPM_UART_RXBD_W	beq		1f	addi	%r7,%r11,PPC8260CPM_BD_SIZE	b		2f1:	addi	%r7,%r7,PPC8260CPM_BD_SIZE2:	sub		%r7,%r7,%r9					#relative	stw		%r7,0(%r11)	li		%r3,1	mtmsr	%r8	blr		CALLOUT_END		break_detect_8260cpm 

⌨️ 快捷键说明

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