<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=EN-US link=blue vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Hi Sam,</p><p class=MsoNormal>You need to add the timer.h file to the list of files to be installed:</p><p class=MsoNormal><a href="https://git.rtems.org/rtems/tree/spec/build/bsps/microblaze/microblaze_fpga/obj.yml#n14">https://git.rtems.org/rtems/tree/spec/build/bsps/microblaze/microblaze_fpga/obj.yml#n14</a></p><p class=MsoNormal>Alan</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:thesamprice@gmail.com">Sam Price</a><br><b>Sent: </b>Sunday, November 6, 2022 12:52 AM<br><b>To: </b><a href="mailto:devel@rtems.org">Development</a><br><b>Subject: </b>Re: Microblaze 2nd timer interrupt</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I pushed my changes to rtems source</p><p class=MsoNormal>https://github.com/RTEMS/rtems/compare/master...thesamprice:rtems:timer_debug</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>and setup a hello world an example project to test with</p><p class=MsoNormal>https://github.com/thesamprice/rtems_mb_timer/blob/main/hello.c</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>However im getting the following error.</p><p class=MsoNormal>rtems_mb_timer/hello.c:8:10: fatal error: bsp/timer.h: No such file or directory</p><p class=MsoNormal>    8 | #include <bsp/timer.h></p><p class=MsoNormal>      |          ^~~~~~~~~~~~~</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Is the correct approach to just put all bsp specific calls in bsp.h?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>On Sat, Nov 5, 2022 at 10:04 PM Sam Price <thesamprice@gmail.com> wrote:</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> The current microblaze design only has a single timer.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I want to use the 2nd timer on the microblaze to run some low level tasks.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Wondering if someone could see if i'm on the right track.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Regarding the timer from the Xilinx api api</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> """The interrupt service routine reads the timer control/status</p><p class=MsoNormal>> registers to determine the source of the interrupt."""</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Also there is a interrupt controller on microblaze that has a single</p><p class=MsoNormal>> jump register.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> So the underlying logic is interrupt occurs, 32bit interrupt register</p><p class=MsoNormal>> is checked for what bits are set determining what interrupts have</p><p class=MsoNormal>> occured.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> if bit 0 is set then it is a clock interrupt.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Then 2 clock register need checked for what timer caused the interrupt.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Current RTEMS implementation only uses 1 of the timers.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I added static ISR callbacks for the system and user callback at the</p><p class=MsoNormal>> top of the mb clock.c file.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> static rtems_interrupt_handler mblaze_clock_isr = 0x0;</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> static rtems_interrupt_handler mblaze_user_isr = 0x0;</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I added a callback that checks both registers and calls the</p><p class=MsoNormal>> appropriate callback.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> static void microblaze_clock_handler( void * data){</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   volatile Microblaze_Timer *timer = _Microblaze_Timer;</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   if ( ( timer->tcsr0 & MICROBLAZE_TIMER_TCSR0_T0INT ) == 0 )</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   {</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     if(mblaze_clock_isr != 0x0){</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>       mblaze_clock_isr(data);</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   if ( ( timer->tcsr1 & MICROBLAZE_TIMER_TCSR0_T0INT ) == 0 )</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   {</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     if(mblaze_user_isr != 0x0){</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>       mblaze_user_isr(data);</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>       /* Clear the interrupt */</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>       timer->tcsr1 |= MICROBLAZE_TIMER_TCSR0_T0INT;</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I updated the ISR register to store the system clock, and replace the</p><p class=MsoNormal>> isr callback with mine.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> static void microblaze_clock_handler_install( rtems_interrupt_handler isr )</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> {</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   rtems_status_code sc = RTEMS_SUCCESSFUL;</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   mblaze_clock_isr = isr; <- Store the system ISR</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   sc = rtems_interrupt_handler_install(</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     0,</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     "Clock",</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     RTEMS_INTERRUPT_UNIQUE,</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     microblaze_clock_handler, <- Changed from ISR to my new handler.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     NULL</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   );</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   if ( sc != RTEMS_SUCCESSFUL ) {</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>     bsp_fatal( MICROBLAZE_FATAL_CLOCK_IRQ_INSTALL );</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>>   }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> To the microblaze bsp.h</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> im adding my callback functions to register the users clock function.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> void microblaze_user_clock_handler_install(rtems_interrupt_handler isr);</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> And the appropriate non static function to the mb clock.c file</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> void microblaze_user_clock_handler_install(rtems_interrupt_handler isr){</p><p class=MsoNormal>> mblaze_user_isr = isr;</p><p class=MsoNormal>> }</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Anyhow about to compile and see if it works.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-- </p><p class=MsoNormal>Sincerely,</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sam Price</p><p class=MsoNormal>_______________________________________________</p><p class=MsoNormal>devel mailing list</p><p class=MsoNormal>devel@rtems.org</p><p class=MsoNormal>http://lists.rtems.org/mailman/listinfo/devel</p><p class=MsoNormal><o:p> </o:p></p></div></body></html>