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

📄 00000000.htm

📁 水木社区 embeded 版精华区 下载
💻 HTM
📖 第 1 页 / 共 4 页
字号:
&nbsp;ide_ops&nbsp;=&nbsp;&amp;std_ide_ops;&nbsp;<br />#endif&nbsp;<br />#ifdef&nbsp;CONFIG_VT&nbsp;<br />#if&nbsp;defined(CONFIG_DUMMY_CONSOLE)&nbsp;<br />&nbsp;conswitchp&nbsp;=&nbsp;&amp;dummy_con;&nbsp;<br />#endif&nbsp;<br />#endif&nbsp;<br />/*&nbsp;<br />*&nbsp;just&nbsp;set&nbsp;rtc_ops&nbsp;&amp;&amp;&nbsp;pci_ops;&nbsp;forget&nbsp;the&nbsp;rest&nbsp;<br />*/&nbsp;<br />rtc_ops&nbsp;=&nbsp;&amp;myplatform_rtc_ops;&nbsp;<br />pci_ops&nbsp;=&nbsp;&amp;myplatform_pci_ops;&nbsp;<br />}&nbsp;<br />myplatform_pcibios_fixup()&nbsp;<br />myplatform_pcibios_read_config_byte()&nbsp;<br />myplatform_pcibios_read_config_word()&nbsp;<br />myplatform_pcibios_read_config_dword()&nbsp;<br />myplatform_pcibios_write_config_byte()&nbsp;<br />myplatform_pcibios_write_config_word()&nbsp;<br />myplatform_pcibios_write_config_dword()&nbsp;<br />Interrupt&nbsp;handling&nbsp;<br />The&nbsp;trap_init()&nbsp;function&nbsp;copies&nbsp;the&nbsp;top-level&nbsp;exception&nbsp;handlers&nbsp;to&nbsp;the&nbsp;KSEG&nbsp;<br />0&nbsp;vector&nbsp;location&nbsp;based&nbsp;on&nbsp;the&nbsp;CPU&nbsp;type.&nbsp;The&nbsp;interrupt&nbsp;handling&nbsp;code&nbsp;is&nbsp;cont&nbsp;<br />ained&nbsp;in&nbsp;$(TOPDIR)/arch/MY_ARCH/MY_PLATFORM/irq.c&nbsp;and&nbsp;int-handler.S.&nbsp;Most&nbsp;sy&nbsp;<br />stems&nbsp;use&nbsp;a&nbsp;dedicated&nbsp;interrupt&nbsp;controller&nbsp;to&nbsp;handle&nbsp;the&nbsp;interrupts&nbsp;in&nbsp;the&nbsp;s&nbsp;<br />ystem.&nbsp;The&nbsp;interrupt&nbsp;controller&nbsp;is&nbsp;hooked&nbsp;to&nbsp;one&nbsp;of&nbsp;the&nbsp;external&nbsp;interrupt&nbsp;l&nbsp;<br />ines&nbsp;in&nbsp;the&nbsp;processor.&nbsp;The&nbsp;architecture-dependent&nbsp;code&nbsp;has&nbsp;to&nbsp;be&nbsp;modified&nbsp;to&nbsp;<br />&nbsp;fit&nbsp;the&nbsp;interrupt&nbsp;controller&nbsp;into&nbsp;the&nbsp;kernel&nbsp;interrupt&nbsp;handling.&nbsp;<br />Listing&nbsp;7&nbsp;shows&nbsp;the&nbsp;platform-specific&nbsp;interrupt&nbsp;initialization&nbsp;code.&nbsp;The&nbsp;top&nbsp;<br />most&nbsp;interrupt&nbsp;handler&nbsp;has&nbsp;to&nbsp;be&nbsp;installed&nbsp;using&nbsp;set_except_vector().&nbsp;The&nbsp;in&nbsp;<br />terrupt&nbsp;controller&nbsp;that&nbsp;is&nbsp;used&nbsp;in&nbsp;the&nbsp;platform&nbsp;has&nbsp;to&nbsp;be&nbsp;initialized&nbsp;next.&nbsp;&nbsp;<br />If&nbsp;remote&nbsp;debugging&nbsp;is&nbsp;enabled,&nbsp;a&nbsp;call&nbsp;to&nbsp;set_debug_traps()&nbsp;has&nbsp;to&nbsp;be&nbsp;made&nbsp;t&nbsp;<br />o&nbsp;allow&nbsp;any&nbsp;breakpoints&nbsp;or&nbsp;error&nbsp;conditions&nbsp;to&nbsp;be&nbsp;properly&nbsp;intercepted&nbsp;and&nbsp;r&nbsp;<br />eported&nbsp;to&nbsp;the&nbsp;debugger.&nbsp;In&nbsp;addition,&nbsp;a&nbsp;breakpoint&nbsp;needs&nbsp;to&nbsp;be&nbsp;generated&nbsp;to&nbsp;&nbsp;<br />begin&nbsp;communication&nbsp;with&nbsp;the&nbsp;debugger&nbsp;running&nbsp;on&nbsp;the&nbsp;host.&nbsp;<br />Listing&nbsp;7:&nbsp;Platform-specific&nbsp;interrupt&nbsp;initialization&nbsp;<br />static&nbsp;void&nbsp;__init&nbsp;myplatform_irq_setup&nbsp;(void)&nbsp;<br />{&nbsp;<br />set_except_vector&nbsp;(0,&nbsp;myplatform_handle_int);&nbsp;<br />//&nbsp;Initialize&nbsp;InterruptController&nbsp;<br />InterruptController_Init(IsrTable);&nbsp;<br />#ifdef&nbsp;CONFIG_REMOTE_DEBUG&nbsp;<br />printk&nbsp;(*Setting&nbsp;debug&nbsp;traps&nbsp;-&nbsp;<br />please&nbsp;connect&nbsp;the&nbsp;remote&nbsp;debugger.\n*);&nbsp;<br />set_debug_traps&nbsp;();&nbsp;<br />breakpoint&nbsp;();&nbsp;<br />#endif&nbsp;<br />}&nbsp;<br />The&nbsp;top-level&nbsp;interrupt&nbsp;handler&nbsp;(Listing&nbsp;8)&nbsp;first&nbsp;saves&nbsp;all&nbsp;the&nbsp;registers&nbsp;an&nbsp;<br />d&nbsp;then&nbsp;disables&nbsp;further&nbsp;interrupts.&nbsp;The&nbsp;CAUSE&nbsp;register&nbsp;is&nbsp;examined&nbsp;to&nbsp;find&nbsp;t&nbsp;<br />he&nbsp;source&nbsp;of&nbsp;the&nbsp;interrupt.&nbsp;If&nbsp;it&nbsp;is&nbsp;a&nbsp;timer&nbsp;interrupt,&nbsp;the&nbsp;corresponding&nbsp;IS&nbsp;<br />R&nbsp;is&nbsp;called.&nbsp;In&nbsp;case&nbsp;it&nbsp;is&nbsp;not&nbsp;a&nbsp;timer&nbsp;interrupt,&nbsp;it&nbsp;checks&nbsp;whether&nbsp;an&nbsp;inter&nbsp;<br />rupt&nbsp;has&nbsp;occurred&nbsp;on&nbsp;the&nbsp;line&nbsp;connected&nbsp;to&nbsp;the&nbsp;interrupt&nbsp;controller.&nbsp;The&nbsp;int&nbsp;<br />errupt&nbsp;handler&nbsp;for&nbsp;the&nbsp;interrupt&nbsp;controller&nbsp;(Listing&nbsp;9)&nbsp;has&nbsp;to&nbsp;get&nbsp;the&nbsp;pendi&nbsp;<br />ng&nbsp;interrupt&nbsp;vector&nbsp;that&nbsp;caused&nbsp;the&nbsp;interrupt&nbsp;and&nbsp;then&nbsp;execute&nbsp;the&nbsp;handler&nbsp;f&nbsp;<br />or&nbsp;the&nbsp;particular&nbsp;interrupt&nbsp;source.&nbsp;<br />Listing&nbsp;8:&nbsp;Top-level&nbsp;interrupt&nbsp;handler&nbsp;<br />NESTED(myplatform_handle_int,&nbsp;PT_SIZE,&nbsp;ra)&nbsp;<br />&nbsp;.set&nbsp;&nbsp;noat&nbsp;<br />&nbsp;SAVE_ALL&nbsp;<br />&nbsp;CLI&nbsp;<br />&nbsp;.set&nbsp;&nbsp;at&nbsp;<br />&nbsp;mfc0&nbsp;&nbsp;s0,&nbsp;CP0_CAUSE&nbsp;&nbsp;#&nbsp;get&nbsp;irq&nbsp;mask&nbsp;<br />&nbsp;/*&nbsp;First,&nbsp;we&nbsp;check&nbsp;for&nbsp;counter/timer&nbsp;IRQ.&nbsp;*/&nbsp;<br />&nbsp;andi&nbsp;&nbsp;a0,&nbsp;s0,&nbsp;CAUSEF_IP5&nbsp;<br />&nbsp;beq&nbsp;&nbsp;a0,&nbsp;zero,&nbsp;1f&nbsp;<br />&nbsp;andi&nbsp;&nbsp;a0,&nbsp;s0,&nbsp;CAUSEF_IP2&nbsp;<br />&nbsp;#&nbsp;delay&nbsp;slot,&nbsp;check&nbsp;hw0&nbsp;interrupt&nbsp;<br />&nbsp;/*&nbsp;Wheee,&nbsp;a&nbsp;timer&nbsp;interrupt.&nbsp;*/&nbsp;<br />&nbsp;move&nbsp;&nbsp;a0,&nbsp;sp&nbsp;<br />&nbsp;jal&nbsp;&nbsp;timer_interrupt&nbsp;<br />&nbsp;nop&nbsp;&nbsp;#&nbsp;delay&nbsp;slot&nbsp;<br />&nbsp;j&nbsp;&nbsp;ret_from_irq&nbsp;<br />&nbsp;nop&nbsp;&nbsp;#&nbsp;delay&nbsp;slot&nbsp;<br />1:&nbsp;<br />&nbsp;beq&nbsp;&nbsp;a0,&nbsp;zero,&nbsp;1f&nbsp;<br />&nbsp;nop&nbsp;<br />&nbsp;/*&nbsp;Wheee,&nbsp;combined&nbsp;hardware&nbsp;<br />&nbsp;level&nbsp;zero&nbsp;interrupt.&nbsp;*/&nbsp;<br />&nbsp;jal&nbsp;&nbsp;InterruptController_InterruptHandler&nbsp;<br />&nbsp;move&nbsp;&nbsp;a0,&nbsp;sp&nbsp;&nbsp;#&nbsp;delay&nbsp;slot&nbsp;<br />&nbsp;j&nbsp;&nbsp;ret_from_irq&nbsp;<br />&nbsp;nop&nbsp;&nbsp;#&nbsp;delay&nbsp;slot&nbsp;<br />1:&nbsp;<br />&nbsp;/*&nbsp;Here&nbsp;by&nbsp;mistake?&nbsp;&nbsp;This&nbsp;is&nbsp;possible,&nbsp;<br />&nbsp;*what&nbsp;can&nbsp;happen&nbsp;is&nbsp;that&nbsp;by&nbsp;the&nbsp;time&nbsp;we&nbsp;<br />&nbsp;*take&nbsp;the&nbsp;&nbsp;exception&nbsp;the&nbsp;IRQ&nbsp;pin&nbsp;goes&nbsp;low,&nbsp;so&nbsp;<br />&nbsp;&nbsp;*just&nbsp;leave&nbsp;if&nbsp;this&nbsp;is&nbsp;the&nbsp;case.&nbsp;<br />&nbsp;&nbsp;*/&nbsp;<br />&nbsp;j&nbsp;&nbsp;ret_from_irq&nbsp;<br />&nbsp;nop&nbsp;<br />&nbsp;END(myplatform_handle_int)&nbsp;<br />Listing&nbsp;9:&nbsp;Interrupt&nbsp;handler&nbsp;for&nbsp;the&nbsp;interrupt&nbsp;controller&nbsp;<br />void&nbsp;<br />InterruptController_InterruptHandler&nbsp;(&nbsp;<br />struct&nbsp;pt_regs&nbsp;*regs&nbsp;<br />)&nbsp;<br />{&nbsp;<br />IntVector&nbsp;intvector;&nbsp;<br />struct&nbsp;irqaction&nbsp;*action;&nbsp;<br />int&nbsp;irq,&nbsp;cpu&nbsp;=&nbsp;smp_processor_id();&nbsp;<br />InterruptControllerGetPendingIntVector(&amp;intvector);&nbsp;<br />InterruptControllerGetPendingIntSrc((&amp;irq);&nbsp;<br />action&nbsp;=&nbsp;(struct&nbsp;irqaction&nbsp;*)intvector;&nbsp;<br />if&nbsp;(&nbsp;action&nbsp;==&nbsp;NULL&nbsp;)&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;printk(*No&nbsp;handler&nbsp;for&nbsp;hw0&nbsp;irq:&nbsp;%i\n*,&nbsp;irq);&nbsp;<br />return;&nbsp;<br />}&nbsp;<br />hardirq_enter(cpu);&nbsp;<br />action-&gt;handler(irq,&nbsp;action-&gt;dev_id,&nbsp;regs);&nbsp;<br />kstat.irqs[0][irq]++;&nbsp;<br />hardirq_exit(cpu);&nbsp;<br />}&nbsp;//&nbsp;InterruptController_InterruptHandler&nbsp;()&nbsp;<br />The&nbsp;functions&nbsp;request_irq(),&nbsp;free_irq(),&nbsp;enable_irq()&nbsp;and&nbsp;disable_irq()&nbsp;have&nbsp;<br />&nbsp;to&nbsp;be&nbsp;implemented&nbsp;for&nbsp;your&nbsp;target&nbsp;platform.&nbsp;request_irq()&nbsp;is&nbsp;used&nbsp;to&nbsp;instal&nbsp;<br />l&nbsp;an&nbsp;interrupt&nbsp;handler&nbsp;for&nbsp;a&nbsp;given&nbsp;interrupt&nbsp;source.&nbsp;free_irq()&nbsp;needs&nbsp;to&nbsp;fre&nbsp;<br />e&nbsp;the&nbsp;memory&nbsp;allocated&nbsp;for&nbsp;the&nbsp;given&nbsp;interrupt.&nbsp;enable_irq()&nbsp;needs&nbsp;to&nbsp;make&nbsp;a&nbsp;<br />&nbsp;call&nbsp;to&nbsp;the&nbsp;interrupt&nbsp;controller&nbsp;function&nbsp;that&nbsp;enables&nbsp;the&nbsp;given&nbsp;interrupt&nbsp;&nbsp;<br />line&nbsp;and&nbsp;disable_irq()&nbsp;needs&nbsp;to&nbsp;disable&nbsp;the&nbsp;given&nbsp;interrupt&nbsp;line.&nbsp;<br />Timer&nbsp;interrupt&nbsp;<br />File&nbsp;$(TOPDIR)/arch/MY_ARCH/MY_PLATFORM/time.c&nbsp;contains&nbsp;the&nbsp;platform-depende&nbsp;<br />nt&nbsp;timer&nbsp;code.&nbsp;The&nbsp;Linux&nbsp;kernel&nbsp;on&nbsp;MIPS&nbsp;requires&nbsp;a&nbsp;100Hz&nbsp;timer&nbsp;interrupt.&nbsp;In&nbsp;<br />&nbsp;the&nbsp;MIPS,&nbsp;one&nbsp;of&nbsp;the&nbsp;timers&nbsp;in&nbsp;coprocessor&nbsp;0&nbsp;is&nbsp;programmed&nbsp;to&nbsp;generate&nbsp;100H&nbsp;<br />z&nbsp;interrupts.&nbsp;The&nbsp;count&nbsp;register&nbsp;and&nbsp;the&nbsp;compare&nbsp;register&nbsp;together&nbsp;make&nbsp;up&nbsp;t&nbsp;<br />he&nbsp;timer.&nbsp;When&nbsp;active,&nbsp;the&nbsp;count&nbsp;register&nbsp;contains&nbsp;a&nbsp;free&nbsp;running&nbsp;counter.&nbsp;O&nbsp;<br />n&nbsp;each&nbsp;processor&nbsp;clock-tick,&nbsp;the&nbsp;value&nbsp;in&nbsp;the&nbsp;register&nbsp;increments&nbsp;by&nbsp;one.&nbsp;Th&nbsp;<br />e&nbsp;register&nbsp;is&nbsp;reset&nbsp;and&nbsp;an&nbsp;external&nbsp;hardware&nbsp;interrupt&nbsp;is&nbsp;generated&nbsp;when&nbsp;the&nbsp;<br />&nbsp;values&nbsp;in&nbsp;the&nbsp;count&nbsp;register&nbsp;and&nbsp;compare&nbsp;register&nbsp;match.&nbsp;After&nbsp;the&nbsp;count&nbsp;re&nbsp;<br />gister&nbsp;is&nbsp;reset,&nbsp;it&nbsp;restarts&nbsp;to&nbsp;count&nbsp;on&nbsp;the&nbsp;next&nbsp;processor&nbsp;clock-tick.&nbsp;The&nbsp;&nbsp;<br />timer&nbsp;interrupt&nbsp;service&nbsp;routine&nbsp;(ISR)&nbsp;needs&nbsp;to&nbsp;call&nbsp;the&nbsp;do_timer()&nbsp;routine.&nbsp;&nbsp;<br />Performing&nbsp;a&nbsp;write&nbsp;to&nbsp;the&nbsp;compare&nbsp;register&nbsp;clears&nbsp;the&nbsp;timer&nbsp;interrupt.&nbsp;<br />Serial&nbsp;console&nbsp;driver&nbsp;<br />The&nbsp;console&nbsp;runs&nbsp;on&nbsp;top&nbsp;of&nbsp;a&nbsp;serial&nbsp;driver.&nbsp;A&nbsp;polled&nbsp;serial&nbsp;driver&nbsp;can&nbsp;be&nbsp;us&nbsp;<br />ed&nbsp;for&nbsp;printk()&nbsp;(kernel&nbsp;debug&nbsp;message)&nbsp;functionality.&nbsp;The&nbsp;minimum&nbsp;functions&nbsp;&nbsp;<br />that&nbsp;this&nbsp;driver&nbsp;needs&nbsp;to&nbsp;provide&nbsp;are&nbsp;the&nbsp;following:&nbsp;<br />serial_console_init()-for&nbsp;registering&nbsp;the&nbsp;console&nbsp;printing&nbsp;procedure&nbsp;for&nbsp;ker&nbsp;<br />nel&nbsp;printk()&nbsp;functionality,&nbsp;before&nbsp;the&nbsp;console&nbsp;driver&nbsp;is&nbsp;properly&nbsp;initialize&nbsp;<br />d&nbsp;<br />serial_console_setup()-for&nbsp;initializing&nbsp;the&nbsp;serial&nbsp;port&nbsp;<br />serial_console_write(struct&nbsp;console&nbsp;*console,&nbsp;const&nbsp;char&nbsp;*string,&nbsp;int&nbsp;count)&nbsp;<br />-for&nbsp;writing&nbsp;&quot;count&quot;&nbsp;characters&nbsp;<br />Hook&nbsp;up&nbsp;the&nbsp;serial&nbsp;port&nbsp;on&nbsp;your&nbsp;development&nbsp;board&nbsp;to&nbsp;your&nbsp;host&nbsp;development&nbsp;p&nbsp;<br />latform,&nbsp;then&nbsp;start&nbsp;up&nbsp;a&nbsp;serial&nbsp;communication&nbsp;program&nbsp;on&nbsp;your&nbsp;host&nbsp;developme&nbsp;<br />nt&nbsp;platform&nbsp;to&nbsp;communicate&nbsp;with&nbsp;your&nbsp;target.&nbsp;<br />tty&nbsp;driver&nbsp;<br />An&nbsp;interrupt&nbsp;driven&nbsp;serial&nbsp;driver&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;create&nbsp;a&nbsp;terminal&nbsp;device.&nbsp;A&nbsp;<br />&nbsp;terminal&nbsp;device&nbsp;can&nbsp;be&nbsp;created&nbsp;by&nbsp;registering&nbsp;the&nbsp;serial&nbsp;driver&nbsp;with&nbsp;tty.&nbsp;A&nbsp;<br />&nbsp;variety&nbsp;of&nbsp;serial&nbsp;drivers&nbsp;are&nbsp;available&nbsp;in&nbsp;the&nbsp;$(TOPDIR)/drivers/char&nbsp;direc&nbsp;<br />tory.&nbsp;The&nbsp;driver&nbsp;that&nbsp;matches&nbsp;closest&nbsp;to&nbsp;the&nbsp;serial&nbsp;port&nbsp;hardware&nbsp;being&nbsp;used&nbsp;<br />&nbsp;should&nbsp;be&nbsp;picked&nbsp;up&nbsp;and&nbsp;modified.&nbsp;The&nbsp;interfaces&nbsp;to&nbsp;an&nbsp;interrupt-driven&nbsp;cha&nbsp;<br />racter&nbsp;driver&nbsp;under&nbsp;Linux&nbsp;have&nbsp;been&nbsp;explained&nbsp;in&nbsp;Linux&nbsp;Device&nbsp;Drivers&nbsp;by&nbsp;Rub&nbsp;<br />ini&nbsp;(see&nbsp;References).&nbsp;<br />CONFIG_SERIAL&nbsp;(serial&nbsp;support)&nbsp;has&nbsp;to&nbsp;be&nbsp;defined&nbsp;as&nbsp;Y&nbsp;in&nbsp;&quot;make&nbsp;config.&quot;&nbsp;To&nbsp;t&nbsp;<br />

⌨️ 快捷键说明

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