Mercurial > ecos
changeset 212:94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/compat/uitron/current/doc/uitron.sgml @@ -0,0 +1,1354 @@ +<part id="compat-uitron"> + <title>µITRON</title> +<CHAPTER id="compat-uitron-microitron-api"> +<TITLE><!-- <xref> -->µITRON API</TITLE> +<SECT1 id="compat-uitron-introduction"> +<TITLE><!-- <index></index> -->Introduction to µITRON</TITLE> +<PARA>The <!-- <index></index> -->µITRON specification +defines a highly flexible operating system architecture designed +specifically for application in embedded systems. The specification addresses +features which are common to the majority of processor architectures and +deliberately avoids virtualization which would adversely impact +real-time performance. The µITRON specification +may be implemented on many hardware platforms and provides significant +advantages by reducing the effort involved in understanding and +porting application software to new processor architectures. </PARA> +<PARA>Several revisions of the µITRON specification exist. + In this release, <EMPHASIS>eCos</EMPHASIS> supports the + µITRON version 3.02 specification, with complete + “Standard functionality” (level S), plus many + “Extended” (level E) functions. The definitive + reference on µITRON is Dr. Sakamura’s book: + <CITETITLE>µITRON 3.0, An Open and Portable Real-Time Operating + System for Embedded Systems</CITETITLE>. + The book can be purchased from the IEEE Press, and + an ASCII version of the standard can be found online at +<ulink url="http://www.itron.gr.jp/">http://www.itron.gr.jp/</ulink>. +The old address +<ulink url="http://tron.um.u-tokyo.ac.jp/TRON/ITRON/"> +http://tron.um.u-tokyo.ac.jp/TRON/ITRON/</ulink> +still exists as a mirror site. </PARA> +</SECT1> +<SECT1 id="compat-uitron-over-ecos"> +<TITLE><!-- <index></index> -->µITRON and <EMPHASIS>eCos</EMPHASIS></TITLE> +<PARA>The <EMPHASIS>eCos</EMPHASIS> kernel implements the functionality +used by the µITRON compatibility subsystem. +The configuration of the kernel influences the behavior of µITRON +programs.</PARA> +<PARA>In particular, the default configuration has time slicing +(also known as round-robin scheduling) switched on; this means that +a task can be moved from <varname>RUN</varname> state +to <varname>READY</varname> state at any time, in +order that one of its peers may run. This is not strictly conformant +to the µITRON specification, which +states that timeslicing may be implemented by periodically issuing +a <literal>rot_rdq(0)</literal> call from +within a periodic task or cyclic handler; otherwise it is expected +that a task runs until it is pre-empted in consequence of synchronization +or communication calls it makes, or the effects of an interrupt +or other external event on a higher priority task cause that task +to become <varname>READY</varname>. To disable timeslicing +functionality in the kernel and µITRON +compatibility environment, please disable the +<LITERAL>CYGSEM_KERNEL_SCHED_TIMESLICE</LITERAL> +configuration option in the kernel package. A description of kernel +scheduling is in <xref linkend="kernel-overview">. </PARA> +<PARA>For another example, the semantics of task queueing when waiting +on a synchronization object depend solely on the way the underlying +kernel is configured. As discussed above, the multi-level queue +scheduler is the only one which is µITRON +compliant, and it queues waiting tasks in FIFO order. Future releases +of that scheduler might be configurable to support priority ordering +of task queues. Other schedulers might be different again: for example +the bitmap scheduler can be used with the µITRON +compatibility layer, even though it only allows one task at each +priority and as such is not µITRON +compliant, but it supports only priority ordering of task queues. +So which queueing scheme is supported is not really a property of +the µITRON compatibility layer; it +depends on the kernel. </PARA> +<PARA>In this version of the µITRON +compatibility layer, the calls to disable and enable scheduling +and interrupts (<FUNCTION>dis_dsp()</FUNCTION>, +<FUNCTION>ena_dsp()</FUNCTION>, <FUNCTION>loc_cpu()</FUNCTION> +and <FUNCTION>unl_cpu()</FUNCTION>) +call underlying kernel functions; in particular, the <FUNCTION>xxx_dsp()</FUNCTION> functions +lock the scheduler entirely, which prevents dispatching of DSRs; functions +implemented by DSRs include clock counters and alarm timers. Thus time “stops” while +dispatching is disabled with <FUNCTION>dis_dsp()</FUNCTION>. </PARA> +<PARA>Like all parts of the <EMPHASIS>eCos</EMPHASIS> system, the +detailed semantics of the µITRON layer +are dependent on its configuration and the configuration of other components +that it uses. The µITRON configuration +options are all defined in the file <filename>pkgconf/uitron.h</filename>, +and can be set using the configuration tool or editing the +<filename>.ecc</filename> +file in your build directory by hand. </PARA> +<PARA>An important configuration option for the µITRON +compatibility layer is “Option: Return Error Codes for Bad Params” +( +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +), which allows a lot of the error +checking code in the µITRON compatibility layer to +be removed. Of course this leaves a program open to undetected errors, +so it should only be used once an application is fully debugged and +tested. Its benefits include reduced code size and faster execution. +However, it affects the API significantly, in that with this option +enabled, bad calls do not return errors, but cause an assert +failure (if that is itself enabled) or malfunction internally. There +is discussion in more detail about this in each section below.</PARA> +<PARA>We now give a brief description of the µITRON +functions which are implemented in this release. Note that all C +and C++ source files should have the following <literal>#include</literal> statement: </PARA> +<PROGRAMLISTING>#include <cyg/compat/uitron/uit_func.h></PROGRAMLISTING> +</SECT1> +<SECT1 id="compat-uitron-task-management-functions"> +<TITLE><!-- <index></index> -->Task Management Functions</TITLE> +<PARA>The following functions are fully supported in this release: </PARA> +<PROGRAMLISTING>ER <FUNCTION>sta_tsk</FUNCTION>( + ID <EMPHASIS>tskid,</EMPHASIS> + INT <EMPHASIS>stacd</EMPHASIS> )</programlisting> + <programlisting> +void <FUNCTION>ext_tsk</FUNCTION>( void )</programlisting> + <programlisting> +void <FUNCTION>exd_tsk</FUNCTION>( void )</programlisting> + <programlisting> +ER <FUNCTION>dis_dsp</FUNCTION>( void )</programlisting> + <programlisting> +ER <FUNCTION>ena_dsp</FUNCTION>( void )</programlisting> + <programlisting> +ER <FUNCTION>chg_pri</FUNCTION>( + ID <EMPHASIS>tskid,</EMPHASIS> + PRI <EMPHASIS>tskpri</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>rot_rdq</FUNCTION>( + PRI <EMPHASIS>tskpri</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>get_tid</FUNCTION>( + ID *<EMPHASIS>p_tskid</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>ref_tsk</FUNCTION>( + T_RTSK *<EMPHASIS>pk_rtsk,</EMPHASIS> + ID <EMPHASIS>tskid</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>ter_tsk</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>rel_wai</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> )</PROGRAMLISTING> +<PARA>The following two functions are supported in this release, +when enabled with the configuration option +<LITERAL>CYGPKG_UITRON_TASKS_CREATE_DELETE</LITERAL> +with some restrictions:</PARA> +<PROGRAMLISTING>ER <FUNCTION>cre_tsk</FUNCTION>( + ID <EMPHASIS>tskid,</EMPHASIS> + T_CTSK *<EMPHASIS>pk_ctsk</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>del_tsk</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> )</PROGRAMLISTING> +<PARA>These functions are restricted as follows:</PARA> +<PARA>Because of the static initialization facilities provided for +system objects, a task is allocated stack space statically in the +configuration. So while tasks can be created and deleted, the same +stack space is used for that task (task ID number) each time. Thus +the stack size (pk_ctsk->stksz) requested in <FUNCTION>cre_tsk()</FUNCTION> is +checked for being less than that which was statically allocated, +and otherwise ignored. This ensures that the new task will have +enough stack to run. For this reason <FUNCTION>del_tsk()</FUNCTION> does +not in any sense free the memory that was in use for the task's +stack. </PARA> +<PARA>The task attributes (pk_ctsk->tskatr) are +ignored; current versions of <EMPHASIS>eCos</EMPHASIS> do not need +to know whether a task is written in assembler or C/C++ so +long as the procedure call standard appropriate to the CPU is followed.</PARA> +<PARA>Extended information (pk_ctsk->exinf) is + ignored.</PARA> +<SECT2> +<TITLE>Error checking</TITLE> +<PARA>For all these calls, an invalid task id (tskid) (less than +1 or greater than the number of configured tasks) only returns E_ID +when bad params return errors ( +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +is enabled, see above).</PARA> +<PARA>Similarly, the following conditions are only checked for, +and only return errors if +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +is enabled:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>pk_crtk in +<FUNCTION>cre_tsk()</FUNCTION> + is a valid pointer, otherwise return E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>ter_tsk()</FUNCTION> + or +<FUNCTION>rel_wai()</FUNCTION> + on the calling task returns E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA>the CPU is not locked already in +<FUNCTION>dis_dsp()</FUNCTION> + and +<FUNCTION>ena_dsp()</FUNCTION> +; returns E_CTX</PARA> +</LISTITEM> +<LISTITEM> +<PARA>priority level in +<FUNCTION>chg_pri()</FUNCTION> + and +<FUNCTION>rot_rdq()</FUNCTION> + is checked for validity, E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>return value pointer in +<FUNCTION>get_tid()</FUNCTION> + and +<FUNCTION>ref_tsk()</FUNCTION> + is a valid pointer, or E_PAR</PARA> +</LISTITEM> +</ITEMIZEDLIST> +<PARA>The following conditions are checked for, and return + error codes if appropriate, regardless of the setting of +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>When create and delete functions +<FUNCTION>cre_tsk()</FUNCTION> + and +<FUNCTION>del_tsk()</FUNCTION> + are supported, all calls which use a valid task ID number check +that the task exists; if not, E_NOEXS is returned</PARA> +</LISTITEM> +<LISTITEM> +<PARA>When supported, +<FUNCTION>cre_tsk()</FUNCTION> +: the task must not already exist; otherwise E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA>When supported, +<FUNCTION>cre_tsk()</FUNCTION> +: the requested stack size must not be larger than that statically +configured for the task; see the configuration options +“Static initializers”, and “Default stack size”. +Else E_NOMEM</PARA> +</LISTITEM> +<LISTITEM> +<PARA>When supported, +<FUNCTION>del_tsk()</FUNCTION> +: the underlying +<EMPHASIS>eCos</EMPHASIS> + thread must not be running - this would imply either a bug or some +program bypassing the +µITRON compatibility layer and manipulating the thread directly. +E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>sta_tsk()</FUNCTION> +: the task must be dormant, else E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>ter_tsk()</FUNCTION> +: the task must not be dormant, else E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>chg_pri()</FUNCTION> +: the task must not be dormant, else E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>rel_wai()</FUNCTION> +: the task must be in +<varname>WAIT</varname> or <varname>WAIT-SUSPEND</varname> + state, else E_OBJ</PARA> +</LISTITEM> +</ITEMIZEDLIST> +</SECT2> +</SECT1> +<SECT1 id="compat-uitron-task-dependent-synch-functions"> +<TITLE><!-- <index></index> -->Task-Dependent Synchronization Functions</TITLE> +<PARA>These functions are fully supported in this release: </PARA> +<PROGRAMLISTING>ER <FUNCTION>sus_tsk</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>rsm_tsk</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>frsm_tsk</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> )</programlisting> +<programlisting> +ER <FUNCTION>slp_tsk</FUNCTION>( void )</programlisting> + <programlisting> +ER <FUNCTION>tslp_tsk</FUNCTION>( + TMO <EMPHASIS>tmout</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>wup_tsk</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>can_wup</FUNCTION>( + INT *<EMPHASIS>p_wupcnt,</EMPHASIS> ID <EMPHASIS>tskid</EMPHASIS> )</PROGRAMLISTING> +<SECT2> +<TITLE>Error checking</TITLE> +<PARA>The following conditions are only checked for, and only return +errors if +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +is enabled (see the configuration option “Return Error Codes for Bad +Params”):</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>invalid tskid; less than 1 or greater than +<LITERAL>CYGNUM_UITRON_TASKS</LITERAL> +returns E_ID</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>wup_tsk()</FUNCTION> +, +<FUNCTION>sus_tsk()</FUNCTION> +, +<FUNCTION>rsm_tsk()</FUNCTION> +, +<FUNCTION>frsm_tsk()</FUNCTION> + on the calling task returns E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA>dispatching is enabled in +<FUNCTION>tslp_tsk()</FUNCTION> + and +<FUNCTION>slp_tsk()</FUNCTION> +, or E_CTX</PARA> +</LISTITEM> +<LISTITEM> +<PARA>tmout must be positive, otherwise E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>return value pointer in +<FUNCTION>can_wup()</FUNCTION> + is a valid pointer, or E_PAR</PARA> +</LISTITEM> +</ITEMIZEDLIST> +<PARA>The following conditions are checked for, and can + return error codes, regardless of the setting of +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL>: +</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>When create and delete functions +<FUNCTION>cre_tsk()</FUNCTION> + and +<FUNCTION>del_tsk()</FUNCTION> + are supported, all calls which use a valid task ID number check +that the task exists; if not, E_NOEXS is returned</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>sus_tsk()</FUNCTION> +: the task must not be dormant, else E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>frsm/rsm_tsk()</FUNCTION> +: the task must be suspended, else E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>tslp/slp_tsk()</FUNCTION> +: return codes E_TMOUT, E_RLWAI and E_DLT +are returned depending on the reason for terminating the sleep</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>wup_tsk()</FUNCTION> + and +<FUNCTION>can_wup()</FUNCTION> +: the task must not be dormant, or E_OBJ is returned</PARA> +</LISTITEM> +</ITEMIZEDLIST> +</SECT2> +</SECT1> +<SECT1 id="compat-uitron-sync-and-comm-functions"> +<TITLE><!-- <index></index> --> Synchronization and Communication Functions</TITLE> +<PARA>These functions are fully supported in this release: </PARA> +<PROGRAMLISTING>ER <FUNCTION>sig_sem</FUNCTION>( + ID <EMPHASIS>semid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>wai_sem</FUNCTION>( + ID <EMPHASIS>semid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>preq_sem</FUNCTION>( + ID <EMPHASIS>semid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>twai_sem</FUNCTION>( + ID <EMPHASIS>semid,</EMPHASIS> TMO <EMPHASIS>tmout</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ref_sem</FUNCTION>( + T_RSEM *<EMPHASIS>pk_rsem ,</EMPHASIS> ID <EMPHASIS>semid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>set_flg</FUNCTION>( + ID <EMPHASIS>flgid,</EMPHASIS> UINT <EMPHASIS>setptn</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>clr_flg</FUNCTION>( + ID <EMPHASIS>flgid,</EMPHASIS> UINT <EMPHASIS>clrptn</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>wai_flg</FUNCTION>( + UINT *<EMPHASIS>p_flgptn,</EMPHASIS> ID <EMPHASIS>flgid ,</EMPHASIS> + UINT <EMPHASIS>waiptn ,</EMPHASIS> UINT <EMPHASIS>wfmode</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>pol_flg</FUNCTION>( + UINT *<EMPHASIS>p_flgptn,</EMPHASIS> ID <EMPHASIS>flgid ,</EMPHASIS> + UINT <EMPHASIS>waiptn ,</EMPHASIS> UINT <EMPHASIS>wfmode</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>twai_flg</FUNCTION>( + UINT *<EMPHASIS>p_flgptn</EMPHASIS> ID <EMPHASIS>flgid ,</EMPHASIS> + UINT <EMPHASIS>waiptn ,</EMPHASIS> UINT <EMPHASIS>wfmode,</EMPHASIS> TMO <EMPHASIS>tmout</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ref_flg</FUNCTION>( + T_RFLG *<EMPHASIS>pk_rflg,</EMPHASIS> ID <EMPHASIS>flgid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>snd_msg</FUNCTION>( + ID <EMPHASIS>mbxid,</EMPHASIS> T_MSG <EMPHASIS>*pk_msg</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>rcv_msg</FUNCTION>( + T_MSG **<EMPHASIS>ppk_msg,</EMPHASIS> ID <EMPHASIS>mbxid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>prcv_msg</FUNCTION>( + T_MSG **<EMPHASIS>ppk_msg,</EMPHASIS> ID <EMPHASIS>mbxid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>trcv_msg</FUNCTION>( + T_MSG **<EMPHASIS>ppk_msg,</EMPHASIS> ID <EMPHASIS>mbxid ,</EMPHASIS> TMO <EMPHASIS>tmout</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ref_mbx</FUNCTION>( + T_RMBX *<EMPHASIS>pk_rmbx,</EMPHASIS> ID <EMPHASIS>mbxid</EMPHASIS> )</PROGRAMLISTING> +<PARA>The following functions are supported in this release (with +some restrictions) if enabled with the appropriate configuration +option for the object type (for example +<LITERAL>CYGPKG_UITRON_SEMAS_CREATE_DELETE</LITERAL>): +</PARA> +<PROGRAMLISTING>ER <FUNCTION>cre_sem</FUNCTION>( + ID <EMPHASIS>semid,</EMPHASIS> T_CSEM *<EMPHASIS>pk_csem</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>del_sem</FUNCTION>( + ID <EMPHASIS>semid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>cre_flg</FUNCTION>( + ID <EMPHASIS>flgid,</EMPHASIS> T_CFLG *<EMPHASIS>pk_cflg</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>del_flg</FUNCTION>( + ID <EMPHASIS>flgid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>cre_mbx</FUNCTION>( + ID <EMPHASIS>mbxid,</EMPHASIS> T_CMBX *<EMPHASIS>pk_cmbx</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>del_mbx</FUNCTION>( + ID <EMPHASIS>mbxid</EMPHASIS> )</PROGRAMLISTING> +<PARA>In general the queueing order when waiting on a synchronization +object depends on the underlying kernel configuration. The multi-level +queue scheduler is required for strict µITRON +conformance and it queues tasks in FIFO order, so requests to create +an object with priority queueing of tasks (<literal>pk_cxxx->xxxatr = TA_TPRI</literal>) +are rejected with E_RSATR. Additional undefined bits in +the attributes fields must be zero. </PARA> +<PARA>In general, extended information (pk_cxxx->exinf) +is ignored. </PARA> +<PARA>For semaphores, the initial semaphore count (pk_csem->isemcnt) +is supported; the new semaphore's count is set. The maximum +count is not supported, and is not in fact defined in type pk_csem. </PARA> +<PARA>For flags, multiple tasks are allowed to wait. Because single +task waiting is a subset of this, the W bit (TA_WMUL) of +the flag attributes is ignored; all other bits must be zero. The +initial flag value is supported. </PARA> +<PARA>For mailboxes, the buffer count is defined statically by kernel +configuration option +<LITERAL>CYGNUM_KERNEL_SYNCH_MBOX_QUEUE_SIZE</LITERAL>; +therefore the buffer count field is not supported and is not in +fact defined in type pk_cmbx. Queueing of messages is FIFO +ordered only, so TA_MPRI (in pk_cmbx->mbxatr) +is not supported. </PARA> +<SECT2> +<TITLE>Error checking</TITLE> +<PARA>The following conditions are only checked for, and only return +errors if +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +is enabled:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>invalid object id; less than 1 or greater than +<LITERAL>CYGNUM_UITRON_TASKS/SEMAS/MBOXES</LITERAL> +as appropriate returns E_ID</PARA> +</LISTITEM> +<LISTITEM> +<PARA>dispatching is enabled in any call which can sleep, or +E_CTX</PARA> +</LISTITEM> +<LISTITEM> +<PARA>tmout must be positive, otherwise E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>pk_cxxx pointers in +<FUNCTION>cre_xxx()</FUNCTION> + must be valid pointers, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>return value pointer in +<FUNCTION>ref_xxx()</FUNCTION> + is valid pointer, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>flag wait pattern must be non-zero, and mode must be valid, +or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>return value pointer in flag wait calls is a valid pointer, +or E_PAR</PARA> +</LISTITEM> +</ITEMIZEDLIST> +<PARA>The following conditions are checked for, and can return error +codes, regardless of the setting of +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>When create and delete functions +<FUNCTION>cre_xxx()</FUNCTION> + and +<FUNCTION>del_xxx()</FUNCTION> + are supported, all calls which use a valid object ID number check +that the object exists. If not, E_NOEXS is returned.</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In create functions +<FUNCTION>cre_xxx()</FUNCTION> +, when supported, if the object already exists, then E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In any call which can sleep, such as +<FUNCTION>twai_sem()</FUNCTION> +: return codes E_TMOUT, E_RLWAI, E_DLT +or of course E_OK are returned depending on the reason +for terminating the sleep</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In polling functions such as +<FUNCTION>preq_sem()</FUNCTION> +return codes E_TMOUT or E_OK are returned depending +on the state of the synchronization object</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In creation functions, the attributes must be compatible +with the selected underlying kernel configuration: in +<FUNCTION>cre_sem()</FUNCTION> + <literal>pk_csem->sematr</literal> + must be equal to +<literal>TA_TFIFO</literal> + else E_RSATR.</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In +<FUNCTION>cre_flg()</FUNCTION> + <literal>pk_cflg->flgatr</literal> + must be either +<varname>TA_WMUL</varname> + or +<varname>TA_WSGL</varname> + else <varname>E_RSATR</varname>.</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In +<FUNCTION>cre_mbx()</FUNCTION> + +<LITERAL>pk_cmbx->mbxatr</LITERAL> + must be +<LITERAL>TA_TFIFO + TA_MFIFO</LITERAL> + else E_RSATR.</PARA> +</LISTITEM> +</ITEMIZEDLIST> +</SECT2> +</SECT1> +<SECT1 id="compat-uitron-extended-sync-comm-functions"> +<TITLE><!-- <index></index> -->Extended Synchronization and Communication Functions</TITLE> +<PARA>None of these functions are supported in this release. </PARA> +</SECT1> +<SECT1 id="compat-uitron-interrupt-management-functions"> +<TITLE><!-- <index></index> -->Interrupt management functions</TITLE> +<PARA>These functions are fully supported in this release:</PARA> +<PROGRAMLISTING>void <FUNCTION> ret_int</FUNCTION>( void ) +</programlisting> +<programlisting> +ER <FUNCTION>loc_cpu</FUNCTION>( void ) +</programlisting> +<programlisting> +ER <FUNCTION>unl_cpu</FUNCTION>( void ) +</programlisting> +<programlisting> +ER <FUNCTION>dis_int</FUNCTION>( + UINT <EMPHASIS>eintno</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ena_int</FUNCTION>( + UINT <EMPHASIS>eintno</EMPHASIS> ) +</programlisting> +<programlisting> +void <FUNCTION>ret_wup</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>iwup_tsk</FUNCTION>( + ID <EMPHASIS>tskid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>isig_sem</FUNCTION>( + ID <EMPHASIS>semid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>iset_flg</FUNCTION>( + ID <EMPHASIS>flgid ,</EMPHASIS> + UID<EMPHASIS> setptn</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>isend_msg</FUNCTION>( + ID <EMPHASIS>mbxid ,</EMPHASIS> + T_MSG<EMPHASIS> *pk_msg</EMPHASIS> )</PROGRAMLISTING> +<PARA>Note that <FUNCTION>ret_int()</FUNCTION> and +the <FUNCTION>ret_wup()</FUNCTION> are implemented +as macros, containing a “return” statement.</PARA> +<PARA>Also note that <FUNCTION>ret_wup()</FUNCTION> and +the <FUNCTION>ixxx_yyy()</FUNCTION> style functions +will only work when called from an ISR whose associated DSR is <FUNCTION>cyg_uitron_dsr()</FUNCTION>, +as specified in include file <filename><cyg/compat/uitron/uit_ifnc.h></filename>, +which defines the <FUNCTION>ixxx_yyy()</FUNCTION> style +functions also.</PARA> +<PARA>If you are writing interrupt handlers more in the +<EMPHASIS>eCos</EMPHASIS> style, with separate ISR and DSR routines both of +your own devising, do not use these special functions from a DSR: use plain +<FUNCTION>xxx_yyy()</FUNCTION> style functions (with no ‘i’ prefix) +instead, and do not call any µITRON functions from the ISR at +all.</PARA> +<PARA>The following functions are not supported in this release: </PARA> +<PROGRAMLISTING>ER <FUNCTION>def_int</FUNCTION>( + UINT <EMPHASIS>dintno,</EMPHASIS> + T_DINT *<EMPHASIS>pk_dint</EMPHASIS> )</programlisting> + <programlisting> +ER <FUNCTION>chg_iXX</FUNCTION>( + UINT <EMPHASIS>iXXXX</EMPHASIS> ) + </programlisting> + <programlisting> +ER <FUNCTION>ref_iXX</FUNCTION>( + UINT * <EMPHASIS>p_iXXXX</EMPHASIS> )</PROGRAMLISTING> +<PARA>These unsupported functions are all Level C (CPU dependent). +Equivalent functionality is available via other <EMPHASIS>eCos</EMPHASIS>-specific +APIs. </PARA> +<SECT2> +<TITLE>Error checking</TITLE> +<PARA>The following conditions are only checked for, and only return +errors if +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +is enabled:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA><FUNCTION>loc/unl_cpu()</FUNCTION> +: these must only be called in a +µITRON task context, else E_CTX.</PARA> +</LISTITEM> +<LISTITEM> +<PARA><FUNCTION>dis/ena_int()</FUNCTION> +: the interrupt number must be in range as specified by the platform +HAL in qustion, else E_PAR.</PARA> +</LISTITEM> +</ITEMIZEDLIST> +</SECT2> +</SECT1> +<SECT1 id="compat-uitron-memory-pool-mgmt-functions"> +<TITLE><!-- <index></index> --> Memory pool Management Functions</TITLE> +<PARA>These functions are fully supported in this release: </PARA> +<PROGRAMLISTING>ER <FUNCTION>get_blf</FUNCTION>( + VP *<EMPHASIS>p_blf,</EMPHASIS> ID <EMPHASIS>mpfid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>pget_blf</FUNCTION>( + VP *<EMPHASIS>p_blf,</EMPHASIS> ID <EMPHASIS>mpfid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>tget_blf</FUNCTION>( + VP *<EMPHASIS>p_blf,</EMPHASIS> ID <EMPHASIS>mpfid,</EMPHASIS> TMO <EMPHASIS>tmout</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>rel_blf</FUNCTION>( + ID <EMPHASIS>mpfid,</EMPHASIS> VP <EMPHASIS>blf</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ref_mpf</FUNCTION>( + T_RMPF *<EMPHASIS>pk_rmpf,</EMPHASIS> ID <EMPHASIS>mpfid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>get_blk</FUNCTION>( + VP *<EMPHASIS>p_blk,</EMPHASIS> ID <EMPHASIS>mplid,</EMPHASIS> INT <EMPHASIS>blksz</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>pget_blk</FUNCTION>( + VP *<EMPHASIS>p_blk,</EMPHASIS> ID <EMPHASIS>mplid,</EMPHASIS> INT <EMPHASIS>blksz</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>tget_blk</FUNCTION>( + VP *<EMPHASIS>p_blk,</EMPHASIS> ID <EMPHASIS>mplid,</EMPHASIS> INT <EMPHASIS>blksz,</EMPHASIS> TMO <EMPHASIS>tmout</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>rel_blk</FUNCTION>( + ID <EMPHASIS>mplid,</EMPHASIS> VP <EMPHASIS>blk</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ref_mpl</FUNCTION>( + T_RMPL *<EMPHASIS>pk_rmpl,</EMPHASIS> ID <EMPHASIS>mplid ) +</EMPHASIS></programlisting> + +<PARA>Note that of the memory provided for a particular pool to +manage in the static initialization of the memory pool objects, +some memory will be used to manage the pool itself. Therefore the +number of blocks * the blocksize will be less than the total +memory size. </PARA> +<PARA>The following functions are supported in this release, when +enabled with +<LITERAL>CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETE</LITERAL> +or +<LITERAL>CYGPKG_UITRON_MEMPOOLFIXED_CREATE_DELETE</LITERAL> +as appropriate, with some restrictions: </PARA> +<PROGRAMLISTING>ER <FUNCTION>cre_mpl</FUNCTION>( + ID <EMPHASIS>mplid,</EMPHASIS> T_CMPL *<EMPHASIS>pk_cmpl</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>del_mpl</FUNCTION>( + ID <EMPHASIS>mplid</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>cre_mpf</FUNCTION>( + ID <EMPHASIS>mpfid,</EMPHASIS> T_CMPF *<EMPHASIS>pk_cmpf</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>del_mpf</FUNCTION>( + ID <EMPHASIS>mpfid</EMPHASIS> )</PROGRAMLISTING> +<PARA>Because of the static initialization facilities provided for +system objects, a memory pool is allocated a region of memory to +manage statically in the configuration. So while memory pools can +be created and deleted, the same area of memory is used for that +memory pool (memory pool ID number) each time. The requested variable pool +size (pk_cmpl->mplsz) or the number of fixed-size +blocks (pk_cmpf->mpfcnt) times the block size +(pk_cmpf->blfsz) are checked for fitting within +the statically allocated memory area, so if a create call succeeds, +the resulting pool will be at least as large as that requested. +For this reason <FUNCTION>del_mpl()</FUNCTION> and <FUNCTION>del_mpf()</FUNCTION> do +not in any sense free the memory that was managed by the deleted +pool for use by other pools; it may only be managed by a pool of +the same object id. </PARA> +<PARA>For both fixed and variable memory pools, the queueing order +when waiting on a synchronization object depends on the underlying +kernel configuration. The multi-level queue scheduler is required +for strict µITRON conformance and +it queues tasks in FIFO order, so requests to create an object with +priority queueing of tasks (pk_cxxx->xxxatr = TA_TPRI) +are rejected with E_RSATR. Additional undefined bits in +the attributes fields must be zero. </PARA> +<PARA>In general, extended information (pk_cxxx->exinf) +is ignored. </PARA> +<SECT2> +<TITLE>Error checking</TITLE> +<PARA>The following conditions are only checked for, and only return +errors if +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +is enabled:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>invalid object id; less than 1 or greater than +<LITERAL>CYGNUM_UITRON_MEMPOOLVAR/MEMPOOLFIXED</LITERAL> +as appropriate returns E_ID</PARA> +</LISTITEM> +<LISTITEM> +<PARA>dispatching is enabled in any call which can sleep, or +E_CTX</PARA> +</LISTITEM> +<LISTITEM> +<PARA>tmout must be positive, otherwise E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>pk_cxxx pointers in +<FUNCTION>cre_xxx()</FUNCTION> + must be valid pointers, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>return value pointer in +<FUNCTION>ref_xxx()</FUNCTION> + is a valid pointer, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>return value pointers in get block routines is a valid +pointer, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>blocksize request in get variable block routines is greater +than zero, or E_PAR</PARA> +</LISTITEM> +</ITEMIZEDLIST> +<PARA>The following conditions are checked for, and can return error +codes, regardless of the setting of +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL>: +</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>When create and delete functions +<FUNCTION>cre_xxx()</FUNCTION> + and +<FUNCTION>del_xxx()</FUNCTION> + are supported, all calls which use a valid object ID number check +that the object exists. If not, E_NOEXS is returned.</PARA> +</LISTITEM> +<LISTITEM> +<PARA>When create functions +<FUNCTION>cre_xxx()</FUNCTION> + are supported, if the object already exists, then E_OBJ</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In any call which can sleep, such as +<FUNCTION>get_blk()</FUNCTION> +: return codes E_TMOUT, E_RLWAI, E_DLT +or of course E_OK are returned depending on the reason +for terminating the sleep</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In polling functions such as +<FUNCTION>pget_blk()</FUNCTION> +return codes E_TMOUT or E_OK are returned depending +on the state of the synchronization object</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In creation functions, the attributes must be compatible +with the selected underlying kernel configuration: in +<FUNCTION>cre_mpl()</FUNCTION> + +<LITERAL>pk_cmpl->mplatr</LITERAL> + must be equal to +<LITERAL>TA_TFIFO</LITERAL> + else E_RSATR.</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In +<FUNCTION>cre_mpf()</FUNCTION> + +<LITERAL>pk_cmpf->mpfatr</LITERAL> + must be equal to +<LITERAL>TA_TFIFO</LITERAL> + else E_RSATR.</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In creation functions, the requested size of the memory +pool must not be larger than that statically configured for the +pool else E_RSATR; see the configuration option +“Option: Static initializers”. + In +<FUNCTION>cre_mpl()</FUNCTION> + +<LITERAL>pk_cmpl->mplsz</LITERAL> + is the field of interest</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In +<FUNCTION>cre_mpf()</FUNCTION> + the product of +<LITERAL>pk_cmpf->blfsz</LITERAL> + and +<LITERAL>pk_cmpf->mpfcnt</LITERAL> + must be smaller than the memory statically configured for the pool +else E_RSATR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>In functions which return memory to the pool +<FUNCTION>rel_blk()</FUNCTION> + and +<FUNCTION>rel_blf()</FUNCTION> +, if the free fails, for example because the memory did not come +from that pool originally, then E_PAR is returned</PARA> +</LISTITEM> +</ITEMIZEDLIST> +</SECT2> +</SECT1> +<SECT1 id="compat-uitron-time-mgmt-functions"> +<TITLE><!-- <index></index> -->Time Management Functions</TITLE> +<PARA>These functions are fully supported in this release: </PARA> +<PROGRAMLISTING>ER <FUNCTION>set_tim</FUNCTION>( + SYSTIME *<EMPHASIS>pk_tim</EMPHASIS> )</PROGRAMLISTING> +<CAUTION> +<PARA> Setting the time may cause erroneous operation of the + kernel, for example a task performing a wait with a + time-out may never awaken.</PARA> +</CAUTION> +<PROGRAMLISTING>ER <FUNCTION>get_tim</FUNCTION>( + SYSTIME *<EMPHASIS>pk_tim</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>dly_tsk</FUNCTION>( + DLYTIME <EMPHASIS>dlytim</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>def_cyc</FUNCTION>( + HNO <EMPHASIS>cycno,</EMPHASIS> T_DCYC *<EMPHASIS>pk_dcyc</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>act_cyc</FUNCTION>( + HNO <EMPHASIS>cycno,</EMPHASIS> UINT <EMPHASIS>cycact</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ref_cyc</FUNCTION>( + T_RCYC *<EMPHASIS>pk_rcyc,</EMPHASIS> HNO <EMPHASIS>cycno</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>def_alm</FUNCTION>( + HNO <EMPHASIS>almno,</EMPHASIS> T_DALM *<EMPHASIS>pk_dalm</EMPHASIS> ) +</programlisting> +<programlisting> +ER <FUNCTION>ref_alm</FUNCTION>( + T_RALM *<EMPHASIS>pk_ralm,</EMPHASIS> HNO <EMPHASIS>almno</EMPHASIS> ) +</programlisting> +<programlisting> +void <FUNCTION>ret_tmr</FUNCTION>( void )</programlisting> + <sect2> + <title>Error checking</title> +<PARA>The following conditions are only checked for, and only return +errors if +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +is enabled:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>invalid handler number; less than 1 or greater than +<LITERAL>CYGNUM_UITRON_CYCLICS/ALARMS</LITERAL> +as appropriate, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>dispatching is enabled in +<FUNCTION>dly_tsk()</FUNCTION> +, or E_CTX</PARA> +</LISTITEM> +<LISTITEM> +<PARA>dlytim must be positive or zero, otherwise E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>return value pointer in +<FUNCTION>ref_xxx()</FUNCTION> + is a valid pointer, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>params within pk_dalm and pk_dcyc must +be valid, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>cycact in +<FUNCTION>act_cyc()</FUNCTION> + must be valid, or E_PAR</PARA> +</LISTITEM> +<LISTITEM> +<PARA>handler must be defined in +<FUNCTION>ref_xxx()</FUNCTION> + and +<FUNCTION>act_cyc()</FUNCTION> +, or E_NOEXS</PARA> +</LISTITEM> +<LISTITEM> +<PARA>parameter pointer must be a good pointer in +<FUNCTION>get_tim()</FUNCTION> + and +<FUNCTION>set_tim()</FUNCTION> +, otherwise E_PAR is returned</PARA> +</LISTITEM> +</ITEMIZEDLIST> +<PARA>The following conditions are checked for, and can return + error codes, regardless of the setting of +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> +:</PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA><FUNCTION>dly_tsk()</FUNCTION> +: return code E_RLWAI is returned depending on the reason +for terminating the sleep</PARA> +</LISTITEM> +</ITEMIZEDLIST> +</sect2> +</SECT1> +<SECT1 id="compat-uitron-system-mgmt-functions"> +<TITLE><!-- <index></index> --> System Management Functions</TITLE> +<PARA>These functions are fully supported in this release: + </PARA> +<PROGRAMLISTING>ER <FUNCTION>get_ver</FUNCTION>( + T_VER *<EMPHASIS>pk_ver</EMPHASIS> ) +</PROGRAMLISTING> +<PROGRAMLISTING>ER <FUNCTION>ref_sys</FUNCTION>( + T_RSYS *<EMPHASIS>pk_rsys</EMPHASIS> ) +</PROGRAMLISTING> +<PROGRAMLISTING>ER <FUNCTION>ref_cfg</FUNCTION>( + T_RCFG *<EMPHASIS>pk_rcfg</EMPHASIS> ) +</PROGRAMLISTING> +<PARA>Note that the information returned by each of these calls +may be configured to match the user's own versioning system, +and the values supplied by the default configuration may be inappropriate. </PARA> +<PARA>These functions are not supported in this release: </PARA> +<PROGRAMLISTING>ER <FUNCTION>def_svc</FUNCTION>( + FN <EMPHASIS>s_fncd,</EMPHASIS> + T_DSVC *<EMPHASIS>pk_dsvc</EMPHASIS> ) +</PROGRAMLISTING> +<PROGRAMLISTING>ER <FUNCTION>def_exc</FUNCTION>( + UINT <EMPHASIS>exckind,</EMPHASIS> + T_DEXC *<EMPHASIS>pk_dexc</EMPHASIS> ) +</PROGRAMLISTING> +<SECT2> +<TITLE>Error checking</TITLE> +<PARA>The following conditions are only checked for, and + only return errors if + +<LITERAL>CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS</LITERAL> + is enabled: </PARA> +<ITEMIZEDLIST> +<LISTITEM> +<PARA>return value pointer in all calls is a valid + pointer, or E_PAR</PARA> +</LISTITEM> +</ITEMIZEDLIST> +</SECT2> +</SECT1> +<SECT1 id="compat-uitron-network-support-functions"> +<TITLE><!-- <index></index> --> Network Support Functions</TITLE> +<PARA>None of these functions are supported in this release. + </PARA> +</SECT1> +<SECT1 id="compat-uitron-configuration-faq"> +<TITLE><!-- <index></index> -->µITRON Configuration FAQ</TITLE> +<PARA><EMPHASIS>Q: How are µITRON objects created?</EMPHASIS> +</PARA> +<PARA> +For each type of uITRON object (tasks, semaphores, flags, mboxes, mpf, mpl) +these two quantities are controlled by configuration: +</PARA> +<ITEMIZEDLIST> +<LISTITEM><PARA> +The <EMPHASIS>maximum</EMPHASIS> number of this type of object. +</PARA></LISTITEM> +<LISTITEM><PARA> +The number of these objects which exist <EMPHASIS>initially</EMPHASIS>. +</PARA></LISTITEM> +</ITEMIZEDLIST> +<PARA> +This is assuming that for the relevant object type, +<EMPHASIS>create</EMPHASIS> and <EMPHASIS>delete</EMPHASIS> +operations are enabled; enabled is the default. For example, the option +<LITERAL>CYGPKG_UITRON_MBOXES_CREATE_DELETE</LITERAL> +controls whether the functions +<FUNCTION>cre_mbx()</FUNCTION> +and +<FUNCTION>del_mbx()</FUNCTION> +exist in the API. If not, then the maximum number of +mboxes is the same as the initial number of mboxes, and so on for all +µITRON object types. +</PARA> +<PARA> +Mboxes have no initialization, so there are only a few, simple +configuration options: +</PARA> +<ITEMIZEDLIST> +<LISTITEM><PARA> +<LITERAL>CYGNUM_UITRON_MBOXES</LITERAL> +is the total number of mboxes that you can have in the +system. By default this is 4, so you can use mboxes 1,2,3 and 4. You +cannot create mboxes outside this range; trying to +<FUNCTION>cre_mbx(5,...)</FUNCTION> +will return an error. +</PARA></LISTITEM> +<LISTITEM><PARA> +<LITERAL>CYGNUM_UITRON_MBOXES_INITIALLY</LITERAL> +is the number of mboxes created +automatically for you, during startup. By default this is 4, so all 4 +mboxes exist already, and an attempt to create one of these +eg. <FUNCTION>cre_mbx(3,...)</FUNCTION> +will return an error because the mbox in quesion already +exists. You can delete a pre-existing mbox, and then re-create it. +</PARA></LISTITEM> +</ITEMIZEDLIST> +<PARA> +If you change +<LITERAL>CYGNUM_UITRON_MBOXES_INITIALLY</LITERAL>, +for example to 0, no mboxes +are created automatically for you during startup. Any attempt to use an +mbox without creating it will return E_NOEXS because the mbox does not +exist. You can create an mbox, say <FUNCTION>cre_mbx(3,...)</FUNCTION> +and then use it, say +<FUNCTION>snd_msg(3,&foo)</FUNCTION>, and all will be well. +</PARA> +<PARA><EMPHASIS>Q: How are µITRON objects initialized?</EMPHASIS> +</PARA> +<PARA> +Some object types have optional initialization. Semaphores are an +example. You could have +<LITERAL>CYGNUM_UITRON_SEMAS</LITERAL>=10 and +<LITERAL>CYGNUM_UITRON_SEMAS_INITIALLY</LITERAL>=5 +which means you can use semaphores 1-5 +straight off, but you must create semaphores 6-10 before you can use them. +If you decide not to initialize semaphores, semaphores 1-5 will have an +initial count of zero. If you decide to initialize them, you must supply +a dummy initializer for semaphores 6-10 also. For example, +in terms of the configuration output in +<filename>pkgconf/uitron.h</filename>: +</PARA> +<PROGRAMLISTING> + #define CYGDAT_UITRON_SEMA_INITIALIZERS \ + CYG_UIT_SEMA( 1 ), \ + CYG_UIT_SEMA( 0 ), \ + CYG_UIT_SEMA( 0 ), \ + CYG_UIT_SEMA( 99 ), \ + CYG_UIT_SEMA( 1 ), \ + CYG_UIT_SEMA_NOEXS, \ + CYG_UIT_SEMA_NOEXS, \ + CYG_UIT_SEMA_NOEXS, \ + CYG_UIT_SEMA_NOEXS, \ + CYG_UIT_SEMA_NOEXS +</PROGRAMLISTING> +<PARA> +Semaphore 1 will have initial count 1, semaphores 2 and 3 will be zero, +number 4 will be 99 initially, 5 will be one and numbers 6 though 10 do not +exist initially. +</PARA> +<PARA> +Aside: this is how the definition of the symbol would appear in the +configuration header file <filename>pkgconf/uitron.h</filename> — +unfortunately editing such a long, multi-line definition is somewhat +cumbersome in the GUI config tool in current releases. The macros +<LITERAL>CYG_UIT_SEMA()</LITERAL> +— to create a semaphore initializer — and +<LITERAL>CYG_UIT_SEMA_NOEXS</LITERAL> +— to invoke a dummy initializer — +are provided in in the environment to help with this. Similar macros are +provided for other object types. The resulting #define symbol is used in +the context of a C++ array initializer, such as: +<PROGRAMLISTING> +Cyg_Counting_Semaphore2 cyg_uitron_SEMAS[ CYGNUM_UITRON_SEMAS ] = { + CYGDAT_UITRON_SEMA_INITIALIZERS +}; +</PROGRAMLISTING> +which is eventually macro-processed to give +<PROGRAMLISTING> +Cyg_Counting_Semaphore2 cyg_uitron_SEMAS[ 10 ] = { + Cyg_Counting_Semaphore2( ( 1 ) ), + Cyg_Counting_Semaphore2( ( 0 ) ), + Cyg_Counting_Semaphore2( ( 0 ) ), + Cyg_Counting_Semaphore2( ( 99 ) ), + Cyg_Counting_Semaphore2( ( 1 ) ), + Cyg_Counting_Semaphore2(0), + Cyg_Counting_Semaphore2(0), + Cyg_Counting_Semaphore2(0), + Cyg_Counting_Semaphore2(0), + Cyg_Counting_Semaphore2(0), +}; +</PROGRAMLISTING> +so you can see how it is necessary to include the dummy entries in that +definition, otherwise the resulting code will not compile correctly. +</PARA> +<PARA> +If you choose +<LITERAL>CYGNUM_UITRON_SEMAS_INITIALLY</LITERAL>=0 +it is meaningless to initialize them, for they must be created and so +initialized then, before use. +</PARA> +<PARA><EMPHASIS>Q: What about µITRON tasks?</EMPHASIS> +</PARA> +<PARA> +Some object types require initialization. Tasks are an example of this. +You must provide a task with a priority, a function to enter when the task +starts, a name (for debugging purposes), and some memory to use for the stack. +For example (again in terms of the resulting +definitions in <filename>pkgconf/uitron.h</filename>): +</PARA> +<PROGRAMLISTING> +#define CYGNUM_UITRON_TASKS 4 // valid task ids are 1,2,3,4 +#define CYGNUM_UITRON_TASKS_INITIALLY 4 // they all exist at start + +#define CYGDAT_UITRON_TASK_EXTERNS \ +extern "C" void startup( unsigned int ); \ +extern "C" void worktask( unsigned int ); \ +extern "C" void lowtask( unsigned int ); \ +static char stack1[ CYGNUM_UITRON_STACK_SIZE ], \ + stack2[ CYGNUM_UITRON_STACK_SIZE ], \ + stack3[ CYGNUM_UITRON_STACK_SIZE ], \ + stack4[ CYGNUM_UITRON_STACK_SIZE ]; + +#define CYGDAT_UITRON_TASK_INITIALIZERS \ + CYG_UIT_TASK("main task", 8, startup, &stack1, sizeof( stack1 )), \ + CYG_UIT_TASK("worker 2" , 9, worktask, &stack2, sizeof( stack2 )), \ + CYG_UIT_TASK("worker 3" , 9, worktask, &stack3, sizeof( stack3 )), \ + CYG_UIT_TASK("low task" ,20, lowtask, &stack4, sizeof( stack4 )), \ + +</PROGRAMLISTING> +<PARA> +So this example has all four tasks statically configured to exist, ready to +run, from the start of time. The “main task” runs a routine +called <FUNCTION>startup()</FUNCTION> at priority 8. Two +“worker” tasks run both a priority 9, and a “low +priority” task runs at priority 20 to do useful non-urgent background +work. +</PARA> +<screen> +Task ID | Exists at | Function | Priority | Stack | Stack + number | startup | entry | | address | size +--------+-----------+----------+----------+---------+---------- + 1 | Yes | startup | 8 | &stack1 | CYGNUM... + 2 | Yes | worktask | 9 | &stack2 | CYGNUM... + 3 | Yes | worktask | 9 | &stack3 | CYGNUM... + 4 | Yes | lowtask | 20 | &stack4 | CYGNUM... +--------+-----------+----------+----------+---------+---------- +</screen> +<PARA><EMPHASIS>Q: How can I create µITRON tasks in the program?</EMPHASIS> +</PARA> +<PARA> +You must provide free slots in the task table in which to create new tasks, +by configuring the number of tasks existing initially to be smaller than +the total. +For a task ID which does not initially exist, it will be told what routine +to call, and what priority it is, when the task is created. But you must +still set aside memory for the task to use for its stack, and give it a +name during initialization. For example: +</PARA> + +<PROGRAMLISTING> +#define CYGNUM_UITRON_TASKS 4 // valid task ids are 1-4 +#define CYGNUM_UITRON_TASKS_INITIALLY 1 // only task #1 exists + +#define CYGDAT_UITRON_TASK_EXTERNS \ +extern "C" void startup( unsigned int ); \ +static char stack1[ CYGNUM_UITRON_STACK_SIZE ], \ + stack2[ CYGNUM_UITRON_STACK_SIZE ], \ + stack3[ CYGNUM_UITRON_STACK_SIZE ], \ + stack4[ CYGNUM_UITRON_STACK_SIZE ]; + +#define CYGDAT_UITRON_TASK_INITIALIZERS \ + CYG_UIT_TASK( "main", 8, startup, &stack1, sizeof( stack1 ) ), \ + CYG_UIT_TASK_NOEXS( "slave", &stack2, sizeof( stack2 ) ), \ + CYG_UIT_TASK_NOEXS( "slave2", &stack3, sizeof( stack3 ) ), \ + CYG_UIT_TASK_NOEXS( "slave3", &stack4, sizeof( stack4 ) ), \ + +</PROGRAMLISTING> +<PARA> +So tasks numbered 2,3 and 4 have been given their stacks during startup, +though they do not yet exist in terms of <FUNCTION>cre_tsk()</FUNCTION> and +<FUNCTION>del_tsk()</FUNCTION> so you can create tasks 2–4 at +runtime. +</PARA> +<screen> +Task ID | Exists at | Function | Priority | Stack | Stack + number | startup | entry | | address | size +--------+-----------+----------+----------+---------+---------- + 1 | Yes | startup | 8 | &stack1 | CYGNUM... + 2 | No | N/A | N/A | &stack2 | CYGNUM... + 3 | No | N/A | N/A | &stack3 | CYGNUM... + 4 | No | N/A | N/A | &stack4 | CYGNUM... +--------+-----------+----------+----------+---------+---------- +</screen> +<PARA> +(you must have at least one task at startup in order that the system can + actually run; this is not so for other uITRON object types) +</PARA> +<PARA><EMPHASIS>Q: Can I have different stack sizes for µITRON tasks?</EMPHASIS> +</PARA> +<PARA> +Simply set aside different amounts of memory for each task to use for its +stack. Going back to a typical default setting for the µITRON tasks, +the definitions in <filename>pkgconf/uitron.h</filename> might look like this: +</PARA> +<PROGRAMLISTING> +#define CYGDAT_UITRON_TASK_EXTERNS \ +extern "C" void task1( unsigned int ); \ +extern "C" void task2( unsigned int ); \ +extern "C" void task3( unsigned int ); \ +extern "C" void task4( unsigned int ); \ +static char stack1[ CYGNUM_UITRON_STACK_SIZE ], \ + stack2[ CYGNUM_UITRON_STACK_SIZE ], \ + stack3[ CYGNUM_UITRON_STACK_SIZE ], \ + stack4[ CYGNUM_UITRON_STACK_SIZE ]; + +#define CYGDAT_UITRON_TASK_INITIALIZERS \ + CYG_UIT_TASK( "t1", 1, task1, &stack1, CYGNUM_UITRON_STACK_SIZE ), \ + CYG_UIT_TASK( "t2", 2, task2, &stack2, CYGNUM_UITRON_STACK_SIZE ), \ + CYG_UIT_TASK( "t3", 3, task3, &stack3, CYGNUM_UITRON_STACK_SIZE ), \ + CYG_UIT_TASK( "t4", 4, task4, &stack4, CYGNUM_UITRON_STACK_SIZE ) + +</PROGRAMLISTING> +<PARA> +Note that +<LITERAL>CYGNUM_UITRON_STACK_SIZE</LITERAL> +is used to control the size of the stack +objects themselves, and to tell the system what size stack is being provided. +</PARA> +<PARA> +Suppose instead stack sizes of 2000, 1000, 800 and 800 were required: +this could be achieved by using the GUI config tool to edit these +options, or editting the <filename>.ecc</filename> file to get these +results in <filename>pkgconf/uitron.h</filename>: +</PARA> +<PROGRAMLISTING> +#define CYGDAT_UITRON_TASK_EXTERNS \ +extern "C" void task1( unsigned int ); \ +extern "C" void task2( unsigned int ); \ +extern "C" void task3( unsigned int ); \ +extern "C" void task4( unsigned int ); \ +static char stack1[ 2000 ], \ + stack2[ 1000 ], \ + stack3[ 800 ], \ + stack4[ 800 ]; + +#define CYGDAT_UITRON_TASK_INITIALIZERS \ + CYG_UIT_TASK( "t1", 1, task1, &stack1, sizeof( stack1 ) ), \ + CYG_UIT_TASK( "t2", 2, task2, &stack2, sizeof( stack2 ) ), \ + CYG_UIT_TASK( "t3", 3, task3, &stack3, sizeof( stack3 ) ), \ + CYG_UIT_TASK( "t4", 4, task4, &stack4, sizeof( stack4 ) ) +</PROGRAMLISTING> +<PARA> +Note that the sizeof() operator has been used to tell the system what size +stacks are provided, rather than quoting a number (which is difficult for +maintenance) or the symbol +<LITERAL>CYGNUM_UITRON_STACK_SIZE</LITERAL> +(which is wrong). +</PARA> +<PARA> +We recommend using (if available in your release) the stacksize symbols +provided in the architectural HAL for your target, called +<LITERAL>CYGNUM_HAL_STACK_SIZE_TYPICAL</LITERAL> +and +<LITERAL>CYGNUM_HAL_STACK_SIZE_MINIMUM</LITERAL>. +So a better (more portable) version of the above might be: +</PARA> +<PROGRAMLISTING> +#define CYGDAT_UITRON_TASK_EXTERNS \ +extern "C" void task1( unsigned int ); \ +extern "C" void task2( unsigned int ); \ +extern "C" void task3( unsigned int ); \ +extern "C" void task4( unsigned int ); \ +static char stack1[ CYGNUM_HAL_STACK_SIZE_TYPICAL + 1200 ], \ + stack2[ CYGNUM_HAL_STACK_SIZE_TYPICAL + 200 ], \ + stack3[ CYGNUM_HAL_STACK_SIZE_TYPICAL ], \ + stack4[ CYGNUM_HAL_STACK_SIZE_TYPICAL ]; + +#define CYGDAT_UITRON_TASK_INITIALIZERS \ + CYG_UIT_TASK( "t1", 1, task1, &stack1, sizeof( stack1 ) ), \ + CYG_UIT_TASK( "t2", 2, task2, &stack2, sizeof( stack2 ) ), \ + CYG_UIT_TASK( "t3", 3, task3, &stack3, sizeof( stack3 ) ), \ + CYG_UIT_TASK( "t4", 4, task4, &stack4, sizeof( stack4 ) ) +</PROGRAMLISTING> +</SECT1> +</CHAPTER> +</part>
--- a/packages/devs/eth/arm/ks32c5000/current/ChangeLog +++ b/packages/devs/eth/arm/ks32c5000/current/ChangeLog @@ -1,3 +1,9 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * src/ks5000_ether.c (ks32c5000_eth_send): Conditionalize on + CYGPKG_KERNEL for presence of thread delay function. + (ks32c5000_eth_init): No need conditionalizing unmask on CYGPKG_NET. + //=========================================================================== //####ECOSGPLCOPYRIGHTBEGIN#### // -------------------------------------------
--- a/packages/devs/eth/arm/ks32c5000/current/src/ks5000_ether.c +++ b/packages/devs/eth/arm/ks32c5000/current/src/ks5000_ether.c @@ -1113,12 +1113,10 @@ static bool ks32c5000_eth_init(struct cy #endif installInterrupts(); EthInit(myMacAddr); -#if defined(CYGPKG_NET) cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EtherBDMARx); cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EtherBDMATx); cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EtherMacRx); cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EtherMacTx); -#endif configDone = 1; ethernetRunning = 1; eth_drv_init(sc, myMacAddr); @@ -1252,7 +1250,7 @@ static void ks32c5000_eth_send(struct et while(!ks32c5000_eth_buffer_send(buf)) { -#if defined(CYGPKG_NET) +#if defined(CYGPKG_KERNEL) // wait a tick and try again. cyg_thread_delay(1); #else
--- a/packages/devs/eth/cf/current/ChangeLog +++ b/packages/devs/eth/cf/current/ChangeLog @@ -1,3 +1,8 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * src/if_sc_lpe.c: Conditionalize use of thread on CYGPKG_KERNEL + not CYGPKG_NET. + 2002-04-12 Gary Thomas <gthomas@redhat.com> * src/if_sc_lpe.c: Clean up warnings.
--- a/packages/devs/eth/cf/current/src/if_sc_lpe.c +++ b/packages/devs/eth/cf/current/src/if_sc_lpe.c @@ -85,12 +85,12 @@ -#ifdef CYGPKG_NET +#ifdef CYGPKG_KERNEL #define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL static char sc_lpe_card_handler_stack[STACK_SIZE]; static cyg_thread sc_lpe_card_handler_thread_data; static cyg_handle_t sc_lpe_card_handler_thread_handle; -#endif // CYGPKG_NET +#endif // CYGPKG_KERNEL static void do_delay(int ticks) @@ -107,7 +107,7 @@ do_delay(int ticks) // and deletions need to be handled and they take time/coordination, thus the // separate thread. // -#ifdef CYGPKG_NET +#ifdef CYGPKG_KERNEL static void #else static int @@ -123,7 +123,7 @@ sc_lpe_card_handler(cyg_addrword_t param unsigned char buf[256], *cp; cyg_uint8* base; unsigned char *vers_product, *vers_manuf, *vers_revision, *vers_date; -#ifndef CYGPKG_NET +#ifndef CYGPKG_KERNEL int tries = 0; #endif bool first = true; @@ -141,7 +141,7 @@ sc_lpe_card_handler(cyg_addrword_t param } if (slot->state != CF_SLOT_STATE_Ready) { diag_printf("CF card won't go ready!\n"); -#ifndef CYGPKG_NET +#ifndef CYGPKG_KERNEL return false; #else continue; @@ -166,7 +166,7 @@ sc_lpe_card_handler(cyg_addrword_t param vers_revision = cp; while (*cp++) ; // Skip to nul vers_date = cp; -#ifndef CYGPKG_NET +#ifndef CYGPKG_KERNEL if (tries != 0) diag_printf("\n"); diag_printf("%s: %s %s %s\n", vers_manuf, vers_product, vers_revision, vers_date); #endif @@ -249,7 +249,7 @@ sc_lpe_card_handler(cyg_addrword_t param (sc->funs->eth_drv->init)(sc, dp->esa); // Tell system card is ready to talk dp->tab->status = CYG_NETDEVTAB_STATUS_AVAIL; -#ifndef CYGPKG_NET +#ifndef CYGPKG_KERNEL cyg_drv_dsr_unlock(); return true; #endif @@ -266,7 +266,7 @@ sc_lpe_card_handler(cyg_addrword_t param } else { cyg_drv_dsr_unlock(); do_delay(50); // FIXME! -#ifndef CYGPKG_NET +#ifndef CYGPKG_KERNEL if (tries == 0) diag_printf("... Waiting for network card: "); diag_printf("."); if (++tries == 10) { @@ -291,7 +291,7 @@ cyg_sc_lpe_init(struct cyg_netdevtab_ent slot = dp->plf_priv = (void*)cf_get_slot(0); dp->tab = tab; -#ifdef CYGPKG_NET +#ifdef CYGPKG_KERNEL // Create card handling [background] thread cyg_thread_create(CYGPKG_NET_THREAD_PRIORITY-1, // Priority sc_lpe_card_handler, // entry
--- a/packages/devs/eth/cl/cs8900a/current/ChangeLog +++ b/packages/devs/eth/cl/cs8900a/current/ChangeLog @@ -1,3 +1,9 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * include/cs8900.h: Check for lost ints if we can - when kernel present. + * src/if_cs8900a.c: Use CYGINT_IO_ETH_INT_SUPPORT_REQUIRED where + appropriate. + 2002-03-20 Gary Thomas <gthomas@redhat.com> 2002-03-06 Pieter Truter <ptruter@intrinsyc.com>
--- a/packages/devs/eth/cl/cs8900a/current/include/cs8900.h +++ b/packages/devs/eth/cl/cs8900a/current/include/cs8900.h @@ -118,7 +118,7 @@ typedef struct cs8900a_priv_data { cyg_addrword_t base; cyg_uint32 txkey; // Used to ack when packet sent struct cyg_netdevtab_entry *tab; -#ifdef CYGPKG_NET +#ifdef CYGPKG_KERNEL cyg_tick_count_t txstart; #endif } cs8900a_priv_data_t;
--- a/packages/devs/eth/cl/cs8900a/current/src/if_cs8900a.c +++ b/packages/devs/eth/cl/cs8900a/current/src/if_cs8900a.c @@ -67,8 +67,7 @@ //========================================================================== #include <pkgconf/system.h> -#ifdef CYGPKG_NET -#include <pkgconf/net.h> +#ifdef CYGPKG_KERNEL #include <cyg/kernel/kapi.h> #endif #include <pkgconf/io_eth_drivers.h> @@ -89,7 +88,7 @@ #undef __WANT_DEVS // NOINTS operation only relevant when the NET package is loaded -#ifndef CYGPKG_NET +#if !defined(CYGPKG_NET) || !defined(CYGPKG_KERNEL) # undef CYGSEM_DEVS_ETH_CL_CS8900A_NOINTS #endif @@ -106,7 +105,7 @@ extern int cyg_io_eth_net_debug; #endif static void cs8900a_poll(struct eth_drv_sc *sc); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED // This ISR is called when the ethernet interrupt occurs static int cs8900a_isr(cyg_vector_t vector, cyg_addrword_t data, HAL_SavedRegisters *regs) @@ -123,7 +122,7 @@ cs8900a_dsr(cyg_vector_t vector, cyg_uco // This conditioning out is necessary because of explicit calls to this // DSR - which would not ever be called in the case of a polled mode // usage ie. in RedBoot. -#ifdef CYGPKG_IO_ETH_DRIVERS_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED cs8900a_priv_data_t* cpd = (cs8900a_priv_data_t *)data; struct cyg_netdevtab_entry *ndp = (struct cyg_netdevtab_entry *)(cpd->tab); struct eth_drv_sc *sc = (struct eth_drv_sc *)(ndp->device_instance); @@ -145,7 +144,7 @@ static void cs8900a_deliver(struct eth_drv_sc *sc) { cs8900a_poll(sc); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED { cs8900a_priv_data_t *cpd = (cs8900a_priv_data_t *)sc->driver_private; // Allow interrupts to happen again @@ -176,7 +175,7 @@ cs8900a_init(struct cyg_netdevtab_entry CYGHWR_CL_CS8900A_PLF_INIT(cpd); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED // Initialize environment, setup interrupt handler cyg_drv_interrupt_create(cpd->interrupt, 0, // Priority - what goes here? @@ -381,7 +380,7 @@ cs8900a_can_send(struct eth_drv_sc *sc) if ((stat & PP_LineStat_LinkOK) == 0) { return false; // Link not connected } -#ifdef CYGPKG_NET +#ifdef CYGPKG_KERNEL // Horrible hack! if (cpd->txbusy) { cyg_tick_count_t now = cyg_current_time(); @@ -416,7 +415,7 @@ cs8900a_send(struct eth_drv_sc *sc, stru // Mark xmitter busy cpd->txbusy = true; cpd->txkey = key; -#ifdef CYGPKG_NET +#ifdef CYGPKG_KERNEL cpd->txstart = cyg_current_time(); #endif // Start the xmit sequence
--- a/packages/devs/eth/frv/frv400/current/ChangeLog +++ b/packages/devs/eth/frv/frv400/current/ChangeLog @@ -1,3 +1,8 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * include/devs_eth_frv400.inl: Use CYGINT_IO_ETH_INT_SUPPORT_REQUIRED + instead of CYGPKG_NET where required. + 2002-03-28 Gary Thomas <gthomas@redhat.com> * cdl/frv400_eth_drivers.cdl: Don't define CYGHWR_NET_DRIVERS as this
--- a/packages/devs/eth/frv/frv400/current/include/devs_eth_frv400.inl +++ b/packages/devs/eth/frv/frv400/current/include/devs_eth_frv400.inl @@ -172,7 +172,7 @@ static void #define CYGHWR_NS_DP83902A_PLF_INIT(dp) _frv400_eth_init(dp) -#ifndef CYGPKG_NET +#ifndef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED static void _frv400_eth_int_clear(dp83902a_priv_data_t *dp) {
--- a/packages/devs/eth/h8300/aki3068net/current/ChangeLog +++ b/packages/devs/eth/h8300/aki3068net/current/ChangeLog @@ -1,3 +1,7 @@ +2002-05-28 Jonathan Larmour <jlarmour@redhat.com> + + * src/if_aki3068net.c: Remove unused includes. + 2002-04-24 Yoshinori Sato <qzb04471@nifty.ne.jp> * New package.
--- a/packages/devs/eth/h8300/aki3068net/current/src/if_aki3068net.c +++ b/packages/devs/eth/h8300/aki3068net/current/src/if_aki3068net.c @@ -69,12 +69,6 @@ #include <cyg/io/eth/eth_drv.h> #include <cyg/io/eth/netdev.h> -#ifdef CYGPKG_NET -#include <pkgconf/net.h> -#else -#include <cyg/hal/hal_if.h> -#endif - #define DP_CARD_RESET 0x1f #include <cyg/io/dp83902a.h>
--- a/packages/devs/eth/ns/dp83902a/current/ChangeLog +++ b/packages/devs/eth/ns/dp83902a/current/ChangeLog @@ -1,3 +1,8 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * src/if_dp83902a.c: Use CYGINT_IO_ETH_INT_SUPPORT_REQUIRED instead + of CYGPKG_NET where required. + 2002-04-12 Gary Thomas <gthomas@redhat.com> * src/if_dp83902a.c: Clean up warnings.
--- a/packages/devs/eth/ns/dp83902a/current/src/if_dp83902a.c +++ b/packages/devs/eth/ns/dp83902a/current/src/if_dp83902a.c @@ -71,13 +71,7 @@ #include <cyg/hal/drv_api.h> #include <cyg/io/eth/eth_drv.h> #include <cyg/io/eth/netdev.h> - -#ifdef CYGPKG_NET -#include <pkgconf/net.h> #include <pkgconf/io_eth_drivers.h> -#else -#include <cyg/hal/hal_if.h> -#endif #include <cyg/io/dp83902a.h> @@ -85,7 +79,7 @@ #include CYGDAT_DEVS_ETH_NS_DP83902A_INL #undef __WANT_DEVS -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED // This ISR is called when the ethernet interrupt occurs static cyg_uint32 dp83902a_isr(cyg_vector_t vector, cyg_addrword_t data) @@ -121,7 +115,7 @@ dp83902a_dsr(cyg_vector_t vector, cyg_uc # endif #endif } -#endif // CYGPKG_NET +#endif // CYGINT_IO_ETH_INT_SUPPORT_REQUIRED // The deliver function (ex-DSR) handles the ethernet [logical] processing static void @@ -180,7 +174,7 @@ dp83902a_init(struct cyg_netdevtab_entry dp->esa[4], dp->esa[5] ); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED cyg_drv_interrupt_create( dp->interrupt, 0, // Priority - unused
--- a/packages/devs/eth/powerpc/fec/current/ChangeLog +++ b/packages/devs/eth/powerpc/fec/current/ChangeLog @@ -1,3 +1,15 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * src/if_fec.c: Use CYGINT_IO_ETH_INT_SUPPORT_REQUIRED where + appropriate. + +2002-05-30 Jesper Skov <jskov@redhat.com> + + * src/if_fec.c: Initialized a variable and removed an unused + variable. Also made one volatile. All to remove warnings. + * src/fec.h: Made more pointers volatile to avoid compiler + warnings. + 2002-04-30 Nick Garnett <nickg@redhat.com> * src/if_fec.c: Changed order of initialization and made code more
--- a/packages/devs/eth/powerpc/fec/current/src/fec.h +++ b/packages/devs/eth/powerpc/fec/current/src/fec.h @@ -92,8 +92,8 @@ struct fec_bd { struct fec_eth_info { volatile struct fec *fec; volatile struct fec_bd *txbd, *rxbd; // Next Tx,Rx descriptor to use - struct fec_bd *tbase, *rbase; // First Tx,Rx descriptor - struct fec_bd *tnext, *rnext; // Next descriptor to check for interrupt + volatile struct fec_bd *tbase, *rbase; // First Tx,Rx descriptor + volatile struct fec_bd *tnext, *rnext; // Next descriptor to check for interrupt int txsize, rxsize; // Length of individual buffers int txactive; // Count of active Tx buffers unsigned long txkey[CYGNUM_DEVS_ETH_POWERPC_FEC_TxNUM]; @@ -104,8 +104,8 @@ struct fec_eth_info { struct fec { unsigned long addr[2]; // ESA unsigned long hash[2]; // Address hash mask - struct fec_bd *RxRing; - struct fec_bd *TxRing; + volatile struct fec_bd *RxRing; + volatile struct fec_bd *TxRing; unsigned long RxBufSize; unsigned char _fill0[0x40-0x1C]; unsigned long eControl; // Master control register
--- a/packages/devs/eth/powerpc/fec/current/src/if_fec.c +++ b/packages/devs/eth/powerpc/fec/current/src/if_fec.c @@ -129,7 +129,7 @@ NETDEVTAB_ENTRY(fec_netdev, fec_eth_init, &fec_eth0_sc); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED #define _FEC_USE_INTS #ifdef _FEC_USE_INTS static cyg_interrupt fec_eth_interrupt; @@ -141,7 +141,7 @@ static cyg_thread fec_fake_int_thread_da static cyg_handle_t fec_fake_int_thread_handle; static void fec_fake_int(cyg_addrword_t); #endif // _FEC_USE_INTS -#endif // CYGPKG_NET +#endif // CYGINT_IO_ETH_INT_SUPPORT_REQUIRED static void fec_eth_int(struct eth_drv_sc *data); #define FEC_ETH_INT CYGNUM_HAL_INTERRUPT_SIU_LVL1 @@ -238,7 +238,7 @@ fec_eth_reset(struct eth_drv_sc *sc, uns struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private; volatile EPPC *eppc = (volatile EPPC *)eppc_base(); volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET); - struct fec_bd *rxbd, *txbd; + volatile struct fec_bd *rxbd, *txbd; unsigned char *RxBUF, *TxBUF; int cache_state, int_state; int i; @@ -394,7 +394,7 @@ fec_eth_init(struct cyg_netdevtab_entry qi->fec = fec; fec_eth_stop(sc); // Make sure it's not running yet -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED #ifdef _FEC_USE_INTS // Set up to handle interrupts cyg_drv_interrupt_create(FEC_ETH_INT, @@ -455,6 +455,7 @@ fec_eth_init(struct cyg_netdevtab_entry CYGACC_CALL_IF_DELAY_US(10000); // 10ms eppc->pip_pbdat |= 0x00004000; // Enable PHY chip // Enable transceiver (PHY) + phy_ok = 0; phy_write(PHY_BMCR, 0, PHY_BMCR_RESET); for (i = 0; i < 10; i++) { phy_ok = phy_read(PHY_BMCR, 0, &phy_state); @@ -524,7 +525,6 @@ fec_eth_control(struct eth_drv_sc *sc, u void *data, int length) { #ifdef ETH_DRV_SET_MC_ALL - struct eth_drv_mc_list *mc_list; struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private; volatile struct fec *fec = qi->fec; #endif @@ -769,7 +769,7 @@ fec_eth_int_vector(struct eth_drv_sc *sc return (FEC_ETH_INT); } -#if defined(CYGPKG_NET) && ~defined(_FEC_USE_INTS) +#if defined(CYGINT_IO_ETH_INT_SUPPORT_REQUIRED) && ~defined(_FEC_USE_INTS) void fec_fake_int(cyg_addrword_t param) {
--- a/packages/devs/eth/powerpc/quicc/current/ChangeLog +++ b/packages/devs/eth/powerpc/quicc/current/ChangeLog @@ -1,3 +1,8 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * src/if_quicc.c: Use CYGINT_IO_ETH_INT_SUPPORT_REQUIRED where + appropriate. + 2001-08-22 Gary Thomas <gthomas@redhat.com> * src/if_quicc.c:
--- a/packages/devs/eth/powerpc/quicc/current/src/if_quicc.c +++ b/packages/devs/eth/powerpc/quicc/current/src/if_quicc.c @@ -130,13 +130,13 @@ NETDEVTAB_ENTRY(quicc_netdev, extern int _mbx_fetch_VPD(int, void *, int); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED static cyg_interrupt quicc_eth_interrupt; static cyg_handle_t quicc_eth_interrupt_handle; #endif static void quicc_eth_int(struct eth_drv_sc *data); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED // This ISR is called when the ethernet interrupt occurs static int quicc_eth_isr(cyg_vector_t vector, cyg_addrword_t data, HAL_SavedRegisters *regs) @@ -152,7 +152,7 @@ static void quicc_eth_deliver(struct eth_drv_sc * sc) { quicc_eth_int(sc); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED // Allow interrupts to happen again cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_CPM_SCC1); #endif @@ -200,7 +200,7 @@ quicc_eth_init(struct cyg_netdevtab_entr HAL_DCACHE_SYNC(); HAL_DCACHE_DISABLE(); -#ifdef CYGPKG_NET +#ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED // Set up to handle interrupts cyg_drv_interrupt_create(CYGNUM_HAL_INTERRUPT_CPM_SCC1, CYGARC_SIU_PRIORITY_HIGH,
--- a/packages/hal/arm/arch/current/ChangeLog +++ b/packages/hal/arm/arch/current/ChangeLog @@ -1,3 +1,13 @@ +2002-05-28 Mark Salter <msalter@redhat.com> + + * cdl/hal_arm.cdl: Tweaked description for + CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS. + Add CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS. + + * src/redboot_linux_exec.c (do_exec): Rework transition to MMU + off and jump to kernel so that it works for non 1-1 mapped + platforms. + 2002-05-20 Gary Thomas <gthomas@redhat.com> * include/hal_io.h: Fix ...STRING macros - not using index.
--- a/packages/hal/arm/arch/current/cdl/hal_arm.cdl +++ b/packages/hal/arm/arch/current/cdl/hal_arm.cdl @@ -233,22 +233,32 @@ cdl_package CYGPKG_HAL_ARM { } cdl_option CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS { - display "Linux execution address" + display "Physical base address of linux kernel" flavor data default_value CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT description " - This is the physical address where Linux expects to be started - from." + This is the physical address of the base of the Linux kernel + image." } cdl_option CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT { - display "Linux execution address" + display "Default physical base address of linux kernel" flavor data default_value 0x00008000 no_define description " - This is the physical address where Linux expects to be started - from. This option gets set by the platform CDL." + This is the physical address of the base of the Linux kernel + image. This option gets set by the platform CDL." + } + + cdl_option CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS { + display "Base address of linux kernel parameter tags" + flavor data + default_value 0x100 + description " + This is the base address of the area of memory used to + pass parameters to the Linux kernel. This should be chosen + to avoid overlap with the kernel and any ramdisk image." } }
--- a/packages/hal/arm/arch/current/src/redboot_linux_exec.c +++ b/packages/hal/arm/arch/current/src/redboot_linux_exec.c @@ -91,6 +91,20 @@ RedBoot_cmd("exec", do_exec ); +// CYGARC_HAL_MMU_OFF inserts code to turn off MMU and jump to a physical +// address. Some ARM implementations may need special handling and define +// their own version. +#ifndef CYGARC_HAL_MMU_OFF +#define CYGARC_HAL_MMU_OFF(__paddr__) \ + " mcr p15,0,r0,c7,c10,4\n" \ + " mcr p15,0,r0,c7,c7,0\n" \ + " mrc p15,0,r0,c1,c0,0\n" \ + " bic r0,r0,#0xd\n" \ + " bic r0,r0,#0x1000\n" \ + " mcr p15,0,r0,c1,c0,0\n" \ + " mov pc," #__paddr__ "\n" +#endif + // // Parameter info for Linux kernel // ** C A U T I O N ** This setup must match "asm-arm/setup.h" @@ -243,9 +257,12 @@ do_exec(int argc, char *argv[]) struct option_info opts[6]; char line[8]; char *cmd_line; - struct tag *params = (struct tag *)0x0100; + struct tag *params = (struct tag *)CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS; + extern char __tramp_start__[], __tramp_end__[]; - entry = (unsigned long)CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS); // Default Linux execute address + // Default physical entry point for Linux is kernel base. + entry = (unsigned long)CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS; + base_addr = load_address; length = load_address_end - load_address; ramdisk_size = 4096*1024; @@ -339,73 +356,49 @@ do_exec(int argc, char *argv[]) HAL_ICACHE_INVALIDATE_ALL(); HAL_DCACHE_INVALIDATE_ALL(); - // Tricky code. We are currently running with the MMU on and the - // memory map convoluted from 1-1. The trampoline code between - // labels 1 and 2 must be copied to RAM and then executed at the - // non-mapped address. Then when the code turns off the MMU, the - // control flow is unchanged and control can be passed safely to - // the program to be executed. - // Note: This only works if phys=virt (or there are appropriate - // double mapping of the memory). This should be rewritten - // so a jump follows immediately after the MMU disable - // operation. + // Tricky code. We are currently running with the MMU on and the + // memory map possibly convoluted from 1-1. The trampoline code + // between labels __tramp_start__ and __tramp_end__ must be copied + // to RAM and then executed at the non-mapped address. // - // This magic was created in order to - // be able to execute standard Linux kernels with as little - // change/perturberance as possible. - asm volatile ("\n" // Copy code between labels 1-2 to the - " ldr r2,=1f;\n" // trampoline address... - " ldr r3,=2f;\n" - " mov r5,%0;\n" - "4:\n" - " ldr r1,[r2],#4;\n" - " str r1,[r5],#4;\n" - " cmp r2,r3;\n" - " bne 4b;\n" - " nop;nop;nop;nop;nop;nop;nop;nop;\n" - " mov r5,%1;\n" - " mov r2,%2;\n" - " mov r3,%3;\n" - " mov r7,%4;\n" - " mov r6,%5;\n" - " mov pc,%0;\n" //... and jump to it. - " \n" - "1:\n" - " mrs r1,cpsr;\n" // Put processor in IRQ mode - " bic r0,r1,#0x1F;\n" - " orr r0,r0,#0x12;\n" - " msr cpsr,r0;\n" - " msr spsr,r1;\n" - " mov lr,r5;\n" // Set kernel entry point - " mov sp,r5;\n" // Give the kernel a stack just below the entry point - " mov r1,#0;\n" // Turn off MMU and caches - " mcr p15,0,r1,c1,c0;\n" - " nop;nop;nop;\n" - " cmp r2,r6;\n" // Default kernel load address. Relocate - " beq 10f;\n" // kernel image there if necessary, and - " cmp r3,#0;\n" // if size is non-zero - " beq 10f;\n" - "05:\n" - " ldr r4,[r2],#4;\n" - " str r4,[r6],#4;\n" - " sub r3,r3,#4;\n" - " cmp r3,#0;\n" - " bne 05b;\n" - "10:\n" - " mov r0,#0;\n" // Set board type and start the kernel - " mov r1,r7;\n" - " movs pc,lr;\n" - "2:\n" - : : - "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)), - "r"(entry), - "r"(CYGARC_PHYSICAL_ADDRESS(base_addr)), - "r"(length), - "r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE), - "r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS) : - "r7","r6","r5","r2","r3","r1"); + // This magic was created in order to be able to execute standard + // Linux kernels with as little change/perturberance as possible. + + // copy the trampline code + memcpy((char *)CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS, + __tramp_start__, + __tramp_end__ - __tramp_start__); + + asm volatile ( + CYGARC_HAL_MMU_OFF(%5) + "__tramp_start__:\n" + " cmp %1,%4;\n" // Default kernel load address. Relocate + " beq 2f;\n" // kernel image there if necessary, and + " cmp %2,#0;\n" // if size is non-zero + " beq 2f;\n" + "1:\n" + " ldr r0,[%1],#4;\n" + " str r0,[%4],#4;\n" + " subs %2,%2,#4;\n" + " bne 1b;\n" + "2:\n" + " mov r0,#0;\n" // Set board type + " mov r1,%3;\n" // Machine type + " mov r2,%6;\n" // Kernel parameters + " mov pc,%0;\n" // Jump to kernel + "__tramp_end__:\n" + : : + "r"(entry), + "r"(CYGARC_PHYSICAL_ADDRESS(base_addr)), + "r"(length), + "r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE), + "r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS), + "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)), + "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS)) + : "r0", "r1" + ); } - + #endif // HAL_PLATFORM_MACHINE_TYPE - otherwise we do not support this stuff... // EOF redboot_linux_exec.c
--- a/packages/hal/arm/iq80310/current/ChangeLog +++ b/packages/hal/arm/iq80310/current/ChangeLog @@ -1,3 +1,12 @@ +2002-05-28 Mark Salter <msalter@redhat.com> + + * cdl/hal_arm_iq80310.cdl: Add Linux boot support. + * misc/redboot_RAM.ecm: Ditto. + * misc/redboot_ROM.ecm: Ditto. + + * include/hal_iq80310.h (CYGARC_HAL_MMU_OFF): Xscale has + special requirements for turning off MMU. + 2002-05-24 Jonathan Larmour <jlarmour@redhat.com> * src/hal_diag.c: Support dynamic getting and setting of baud rates.
--- a/packages/hal/arm/iq80310/current/cdl/hal_arm_iq80310.cdl +++ b/packages/hal/arm/iq80310/current/cdl/hal_arm_iq80310.cdl @@ -179,6 +179,25 @@ cdl_package CYGPKG_HAL_ARM_IQ80310 { } } + cdl_component CYGPKG_REDBOOT_XSCALE_OPTIONS { + display "Redboot for XScale options" + flavor none + no_define + parent CYGPKG_REDBOOT + active_if CYGPKG_REDBOOT + description " + This option lists the target's requirements for a valid Redboot + configuration." + + # RedBoot details + requires { CYGSEM_REDBOOT_ARM_LINUX_BOOT } + requires { CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT == 0xa0008000 } + define_proc { + puts $::cdl_header "#define CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS 0xA1FF0000" + puts $::cdl_header "#define HAL_PLATFORM_MACHINE_TYPE 70" + } + } + cdl_component CYGBLD_GLOBAL_OPTIONS { display "Global build options" flavor none
--- a/packages/hal/arm/iq80310/current/include/hal_iq80310.h +++ b/packages/hal/arm/iq80310/current/include/hal_iq80310.h @@ -579,6 +579,22 @@ extern unsigned int _80312_EMISR; // Only valid for PEC ISR #endif +// ------------------------------------------------------------------------ + +// Override the default MMU off code. This is intended +// to be included in an inline asm statement. +#define CYGARC_HAL_MMU_OFF(__paddr__) \ + " mrc p15,0,r0,c1,c0,0\n" \ + " bic r0,r0,#0x05\n" \ + " b 99f\n" \ + " .p2align 5\n" \ + "99:\n" \ + " mcr p15,0,r0,c1,c0,0\n" \ + " mrc p15,0,r0,c2,c0,0\n" \ + " mov r0,r0\n" \ + " sub pc,pc,#4\n" \ + " mov pc," #__paddr__ "\n" + /*---------------------------------------------------------------------------*/ /* end of hal_iq80310.h */
--- a/packages/hal/arm/iq80310/current/misc/redboot_RAM.ecm +++ b/packages/hal/arm/iq80310/current/misc/redboot_RAM.ecm @@ -95,6 +95,14 @@ cdl_component CYGSEM_REDBOOT_BSP_SYSCALL inferred_value 1 }; +cdl_option CYGSEM_REDBOOT_ARM_LINUX_BOOT { + inferred_value 1 +}; + +cdl_option CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT { + inferred_value 0xA0008000 +}; + cdl_option CYGBLD_ISO_STRTOK_R_HEADER { inferred_value 1 <cyg/libc/string/string.h> };
--- a/packages/hal/arm/iq80310/current/misc/redboot_ROM.ecm +++ b/packages/hal/arm/iq80310/current/misc/redboot_ROM.ecm @@ -99,6 +99,14 @@ cdl_component CYGSEM_REDBOOT_BSP_SYSCALL inferred_value 1 }; +cdl_option CYGSEM_REDBOOT_ARM_LINUX_BOOT { + inferred_value 1 +}; + +cdl_option CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT { + inferred_value 0xA0008000 +}; + cdl_option CYGBLD_ISO_STRTOK_R_HEADER { inferred_value 1 <cyg/libc/string/string.h> };
--- a/packages/hal/arm/xscale/iq80321/current/ChangeLog +++ b/packages/hal/arm/xscale/iq80321/current/ChangeLog @@ -1,3 +1,10 @@ +2002-05-28 Mark Salter <msalter@redhat.com> + + * cdl/hal_arm_xscale_iq80321.cdl: Add HAL_PLATFORM_MACHINE_TYPE. + + * misc/redboot_RAM.ecm: Changed Linux address. + * misc/redboot_ROM.ecm: Ditto. + 2002-05-24 Jonathan Larmour <jlarmour@redhat.com> * src/hal_diag.c: Support dynamic getting and setting of baud rates.
--- a/packages/hal/arm/xscale/iq80321/current/cdl/hal_arm_xscale_iq80321.cdl +++ b/packages/hal/arm/xscale/iq80321/current/cdl/hal_arm_xscale_iq80321.cdl @@ -73,6 +73,7 @@ cdl_package CYGPKG_HAL_ARM_XSCALE_IQ8032 puts $::cdl_header "#define HAL_PLATFORM_CPU \"XScale\"" puts $::cdl_header "#define HAL_PLATFORM_BOARD \"IQ80321\"" puts $::cdl_header "#define HAL_PLATFORM_EXTRA \"\"" + puts $::cdl_header "#define HAL_PLATFORM_MACHINE_TYPE 169" } cdl_component CYG_HAL_STARTUP {
--- a/packages/hal/arm/xscale/iq80321/current/misc/redboot_RAM.ecm +++ b/packages/hal/arm/xscale/iq80321/current/misc/redboot_RAM.ecm @@ -90,7 +90,7 @@ cdl_option CYGSEM_REDBOOT_ARM_LINUX_BOOT }; cdl_option CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT { - inferred_value 0xC0008000 + inferred_value 0xA0008000 }; cdl_option CYGBLD_ISO_STRTOK_R_HEADER {
--- a/packages/hal/arm/xscale/iq80321/current/misc/redboot_ROM.ecm +++ b/packages/hal/arm/xscale/iq80321/current/misc/redboot_ROM.ecm @@ -94,7 +94,7 @@ cdl_option CYGSEM_REDBOOT_ARM_LINUX_BOOT }; cdl_option CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT { - inferred_value 0xC0008000 + inferred_value 0xA0008000 }; cdl_option CYGBLD_ISO_STRTOK_R_HEADER {
--- a/packages/hal/arm/xscale/verde/current/ChangeLog +++ b/packages/hal/arm/xscale/verde/current/ChangeLog @@ -1,3 +1,10 @@ +2002-05-28 Mark Salter <msalter@redhat.com> + + * cdl/hal_arm_xscale_verde.cdl: Fix linux exec address test. + + * include/hal_verde.h (CYGARC_HAL_MMU_OFF): XScale has + special requirements for turning off MMU. + 2002-05-24 Jonathan Larmour <jlarmour@redhat.com> * cdl/hal_arm_xscale_verde.cdl: Remove implement of
--- a/packages/hal/arm/xscale/verde/current/cdl/hal_arm_xscale_verde.cdl +++ b/packages/hal/arm/xscale/verde/current/cdl/hal_arm_xscale_verde.cdl @@ -127,7 +127,7 @@ cdl_package CYGPKG_HAL_ARM_XSCALE_VERDE # RedBoot details requires { CYGSEM_REDBOOT_ARM_LINUX_BOOT } - requires { CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT == 0xc0008000 } + requires { CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS_DEFAULT == 0xA0008000 } define_proc { puts $::cdl_header "#define CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS 0x00001f00" }
--- a/packages/hal/arm/xscale/verde/current/include/hal_verde.h +++ b/packages/hal/arm/xscale/verde/current/include/hal_verde.h @@ -88,6 +88,19 @@ static inline void CPWAIT(void) { } #endif +// Override the default MMU off code. This is intended +// to be included in an inline asm statement. +#define CYGARC_HAL_MMU_OFF(__paddr__) \ + " mrc p15,0,r0,c1,c0,0\n" \ + " bic r0,r0,#0x05\n" \ + " b 99f\n" \ + " .p2align 5\n" \ + "99:\n" \ + " mcr p15,0,r0,c1,c0,0\n" \ + " mrc p15,0,r0,c2,c0,0\n" \ + " mov r0,r0\n" \ + " sub pc,pc,#4\n" \ + " mov pc," #__paddr__ "\n" #ifdef __ASSEMBLER__
--- a/packages/hal/powerpc/quicc/current/ChangeLog +++ b/packages/hal/powerpc/quicc/current/ChangeLog @@ -1,3 +1,7 @@ +2002-05-30 Jesper Skov <jskov@redhat.com> + + * src/quicc_smc1.c: Fix warning. + 2001-09-10 Jonathan Larmour <jlarmour@redhat.com> * cdl/hal_powerpc_quicc.cdl (CYGNUM_HAL_QUICC_DIAG_BAUD):
--- a/packages/hal/powerpc/quicc/current/src/quicc_smc1.c +++ b/packages/hal/powerpc/quicc/current/src/quicc_smc1.c @@ -90,7 +90,7 @@ #define QUICC_SMCE_TX 0x02 // Tx interrupt #define QUICC_SMCE_RX 0x01 // Rx interrupt -static struct cp_bufdesc *next_rxbd; +static volatile struct cp_bufdesc *next_rxbd; /* * Initialize SMC1 as a uart. @@ -443,7 +443,7 @@ cyg_hal_plf_serial_isr(void *__ch_data, CYG_ADDRWORD __vector, CYG_ADDRWORD __data) { EPPC *eppc = (EPPC*) __ch_data; - struct cp_bufdesc *bd; + volatile struct cp_bufdesc *bd; char ch; int res = 0; CYGARC_HAL_SAVE_GP();
--- a/packages/hal/powerpc/viper/current/ChangeLog +++ b/packages/hal/powerpc/viper/current/ChangeLog @@ -1,3 +1,7 @@ +2002-05-30 John Dallaway <jld@redhat.com> + + * include/pkgconf/mlt*: Regenerated memory layout files. + 2002-04-30 Nick Garnett <nickg@redhat.com> * src/viper.S: Changed boot ROM wait states from 4 to 7.
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_ram.h +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_ram.h @@ -1,37 +1,37 @@ -// eCos memory layout - Fri Oct 20 10:35:23 2000 - -// This is a generated file - do not edit - -#ifndef __ASSEMBLER__ -#include <cyg/infra/cyg_type.h> -#include <stddef.h> - -#endif -#define CYGMEM_REGION_ram (0) -#define CYGMEM_REGION_ram_SIZE (0x0800000) -#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_vectors) []; -#endif -#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors)) -#define CYGMEM_SECTION_reserved_vectors_SIZE (0x3000) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_vsr_table) []; -#endif -#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table)) -#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x200) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_virtual_table) []; -#endif -#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table)) -#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_for_rom) []; -#endif -#define CYGMEM_SECTION_reserved_for_rom (CYG_LABEL_NAME (__reserved_for_rom)) -#define CYGMEM_SECTION_reserved_for_rom_SIZE (0x3cd00) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__heap1) []; -#endif -#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) -#define CYGMEM_SECTION_heap1_SIZE (0x800000 - (size_t) CYG_LABEL_NAME (__heap1)) +// eCos memory layout - Thu May 30 10:27:39 2002 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include <cyg/infra/cyg_type.h> +#include <stddef.h> + +#endif +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x800000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vectors) []; +#endif +#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors)) +#define CYGMEM_SECTION_reserved_vectors_SIZE (0x3000) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vsr_table) []; +#endif +#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table)) +#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x200) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_virtual_table) []; +#endif +#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table)) +#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_for_rom) []; +#endif +#define CYGMEM_SECTION_reserved_for_rom (CYG_LABEL_NAME (__reserved_for_rom)) +#define CYGMEM_SECTION_reserved_for_rom_SIZE (0x3cd00) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x800000 - (size_t) CYG_LABEL_NAME (__heap1))
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_ram.ldi +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_ram.ldi @@ -1,31 +1,31 @@ -// eCos memory layout - Fri Oct 20 10:35:23 2000 - -// This is a generated file - do not edit - -#include <cyg/infra/cyg_type.inc> - -MEMORY -{ - ram : ORIGIN = 0, LENGTH = 0x0800000 -} - -SECTIONS -{ - SECTIONS_BEGIN - CYG_LABEL_DEFN(__reserved_vectors) = 0; . = CYG_LABEL_DEFN(__reserved_vectors) + 0x3000; - CYG_LABEL_DEFN(__reserved_vsr_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_vsr_table) + 0x200; - CYG_LABEL_DEFN(__reserved_virtual_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_virtual_table) + 0x100; - CYG_LABEL_DEFN(__reserved_for_rom) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_for_rom) + 0x3cd00; - SECTION_vectors (ram, ALIGN (0x10), LMA_EQ_VMA) - SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA) - SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_sbss (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) - CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); - SECTIONS_END -} +// eCos memory layout - Thu May 30 10:27:39 2002 + +// This is a generated file - do not edit + +#include <cyg/infra/cyg_type.inc> + +MEMORY +{ + ram : ORIGIN = 0, LENGTH = 0x800000 +} + +SECTIONS +{ + SECTIONS_BEGIN + CYG_LABEL_DEFN(__reserved_vectors) = 0; . = CYG_LABEL_DEFN(__reserved_vectors) + 0x3000; + CYG_LABEL_DEFN(__reserved_vsr_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_vsr_table) + 0x200; + CYG_LABEL_DEFN(__reserved_virtual_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_virtual_table) + 0x100; + CYG_LABEL_DEFN(__reserved_for_rom) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_for_rom) + 0x3cd00; + SECTION_vectors (ram, ALIGN (0x10), LMA_EQ_VMA) + SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_sbss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +}
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_ram.mlt +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_ram.mlt @@ -1,17 +1,17 @@ -version 0 -region ram 0 800000 0 ! -section reserved_vectors 3000 1 0 0 1 1 1 1 0 0 reserved_vsr_table reserved_vsr_table ! -section reserved_vsr_table 200 10 0 0 0 1 0 1 reserved_virtual_table reserved_virtual_table ! -section reserved_virtual_table 100 10 0 0 0 1 0 1 reserved_for_rom reserved_for_rom ! -section reserved_for_rom 3cd00 10 0 0 0 1 0 1 vectors vectors ! -section vectors 0 10 0 1 0 1 0 1 text text ! -section text 0 4 0 1 0 1 0 1 fini fini ! -section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! -section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! -section rodata 0 8 0 1 0 1 0 1 fixup fixup ! -section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! -section gcc_except_table 0 1 0 1 0 1 0 1 data data ! -section data 0 8 0 1 0 1 0 1 sbss sbss ! -section sbss 0 4 0 1 0 1 0 1 bss bss ! -section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! -section heap1 0 8 0 0 0 0 0 0 ! +version 0 +region ram 0 800000 0 ! +section reserved_vectors 3000 1 0 0 1 1 1 1 0 0 reserved_vsr_table reserved_vsr_table ! +section reserved_vsr_table 200 10 0 0 0 1 0 1 reserved_virtual_table reserved_virtual_table ! +section reserved_virtual_table 100 10 0 0 0 1 0 1 reserved_for_rom reserved_for_rom ! +section reserved_for_rom 3cd00 10 0 0 0 1 0 1 vectors vectors ! +section vectors 0 10 0 1 0 1 0 1 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 1 0 1 0 1 0 1 data data ! +section data 0 8 0 1 0 1 0 1 sbss sbss ! +section sbss 0 4 0 1 0 1 0 1 bss bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 !
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_rom.h +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_rom.h @@ -1,35 +1,35 @@ -// eCos memory layout - Fri Oct 20 10:35:48 2000 - -// This is a generated file - do not edit - -#ifndef __ASSEMBLER__ -#include <cyg/infra/cyg_type.h> -#include <stddef.h> - -#endif -#define CYGMEM_REGION_ram (0) -#define CYGMEM_REGION_ram_SIZE (0x800000) -#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) -#define CYGMEM_REGION_rom (0xfe000000) -#define CYGMEM_REGION_rom_SIZE (0x800000) -#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_vectors) []; -#endif -#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors)) -#define CYGMEM_SECTION_reserved_vectors_SIZE (0x3000) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_vsr_table) []; -#endif -#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table)) -#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x200) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_virtual_table) []; -#endif -#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table)) -#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__heap1) []; -#endif -#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) -#define CYGMEM_SECTION_heap1_SIZE (0x800000 - (size_t) CYG_LABEL_NAME (__heap1)) +// eCos memory layout - Thu May 30 10:21:41 2002 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include <cyg/infra/cyg_type.h> +#include <stddef.h> + +#endif +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x800000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#define CYGMEM_REGION_rom (0xfe000000) +#define CYGMEM_REGION_rom_SIZE (0x800000) +#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vectors) []; +#endif +#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors)) +#define CYGMEM_SECTION_reserved_vectors_SIZE (0x3000) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vsr_table) []; +#endif +#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table)) +#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x200) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_virtual_table) []; +#endif +#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table)) +#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x800000 - (size_t) CYG_LABEL_NAME (__heap1))
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_rom.ldi +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_rom.ldi @@ -1,4 +1,4 @@ -// eCos memory layout - Fri Oct 20 10:35:48 2000 +// eCos memory layout - Thu May 30 10:21:41 2002 // This is a generated file - do not edit
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_rom.mlt +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_rom.mlt @@ -1,17 +1,17 @@ -version 0 -region ram 0 800000 0 ! -region rom fe000000 800000 1 ! -section reserved_vectors 3000 1 0 0 1 1 1 1 0 0 reserved_vsr_table reserved_vsr_table ! -section reserved_vsr_table 200 1 0 0 0 1 0 1 reserved_virtual_table reserved_virtual_table ! -section reserved_virtual_table 100 1 0 0 0 1 0 0 data ! -section data 0 10 1 1 0 1 0 0 sbss ! -section sbss 0 4 0 1 0 1 0 1 bss bss ! -section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! -section heap1 0 8 0 0 0 0 0 0 ! -section vectors 0 1 0 1 1 1 1 1 fe000000 fe000000 text text ! -section text 0 4 0 1 0 1 0 1 fini fini ! -section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! -section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! -section rodata 0 8 0 1 0 1 0 1 fixup fixup ! -section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! -section gcc_except_table 0 1 0 1 0 0 0 1 data ! +version 0 +region ram 0 800000 0 ! +region rom fe000000 800000 1 ! +section reserved_vectors 3000 1 0 0 1 1 1 1 0 0 reserved_vsr_table reserved_vsr_table ! +section reserved_vsr_table 200 1 0 0 0 1 0 1 reserved_virtual_table reserved_virtual_table ! +section reserved_virtual_table 100 1 0 0 0 1 0 0 data ! +section data 0 10 1 1 0 1 0 0 sbss ! +section sbss 0 4 0 1 0 1 0 1 bss bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! +section vectors 0 1 0 1 1 1 1 1 fe000000 fe000000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 1 0 1 0 0 0 1 data !
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_romram.h +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_romram.h @@ -1,32 +1,17 @@ -// eCos memory layout - Fri Oct 20 10:35:23 2000 - -// This is a generated file - do not edit - -#ifndef __ASSEMBLER__ -#include <cyg/infra/cyg_type.h> -#include <stddef.h> - -#endif -#define CYGMEM_REGION_ram (0) -#define CYGMEM_REGION_ram_SIZE (0x0800000) -#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_vectors) []; -#endif -#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors)) -#define CYGMEM_SECTION_reserved_vectors_SIZE (0x3000) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_vsr_table) []; -#endif -#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table)) -#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x200) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__reserved_virtual_table) []; -#endif -#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table)) -#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__heap1) []; -#endif -#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) -#define CYGMEM_SECTION_heap1_SIZE (0x800000 - (size_t) CYG_LABEL_NAME (__heap1)) +// eCos memory layout - Thu May 30 10:05:45 2002 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include <cyg/infra/cyg_type.h> +#include <stddef.h> + +#endif +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x800000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x800000 - (size_t) CYG_LABEL_NAME (__heap1))
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_romram.ldi +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_romram.ldi @@ -1,30 +1,27 @@ -// eCos memory layout - Fri Oct 20 10:35:23 2000 - -// This is a generated file - do not edit - -#include <cyg/infra/cyg_type.inc> - -MEMORY -{ - ram : ORIGIN = 0, LENGTH = 0x0800000 -} - -SECTIONS -{ - SECTIONS_BEGIN - SECTION_vectors (ram, 0x000000, LMA_EQ_VMA) - CYG_LABEL_DEFN(__reserved_vectors) = 0; . = CYG_LABEL_DEFN(__reserved_vectors) + 0x3000; - CYG_LABEL_DEFN(__reserved_vsr_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_vsr_table) + 0x200; - CYG_LABEL_DEFN(__reserved_virtual_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_virtual_table) + 0x100; - SECTION_text (ram, 0x3400, LMA_EQ_VMA) - SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA) - SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_sbss (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) - CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); - SECTIONS_END -} +// eCos memory layout - Thu May 30 10:05:45 2002 + +// This is a generated file - do not edit + +#include <cyg/infra/cyg_type.inc> + +MEMORY +{ + ram : ORIGIN = 0, LENGTH = 0x800000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_vectors (ram, 0, LMA_EQ_VMA) + SECTION_text (ram, 0x3400, LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_sbss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +}
--- a/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_romram.mlt +++ b/packages/hal/powerpc/viper/current/include/pkgconf/mlt_powerpc_viper_romram.mlt @@ -1,17 +1,13 @@ -version 0 -region ram 0 800000 0 ! -section reserved_vectors 3000 1 0 0 1 1 1 1 0 0 reserved_vsr_table reserved_vsr_table ! -section reserved_vsr_table 200 10 0 0 0 1 0 1 reserved_virtual_table reserved_virtual_table ! -section reserved_virtual_table 100 10 0 0 0 1 0 1 reserved_for_rom reserved_for_rom ! -section reserved_for_rom 1cd00 10 0 0 0 1 0 1 vectors vectors ! -section vectors 0 10 0 1 0 1 0 1 text text ! -section text 0 4 0 1 0 1 0 1 fini fini ! -section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! -section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! -section rodata 0 8 0 1 0 1 0 1 fixup fixup ! -section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! -section gcc_except_table 0 1 0 1 0 1 0 1 data data ! -section data 0 8 0 1 0 1 0 1 sbss sbss ! -section sbss 0 4 0 1 0 1 0 1 bss bss ! -section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! -section heap1 0 8 0 0 0 0 0 0 ! +version 0 +region ram 0 800000 0 ! +section vectors 0 1 0 1 1 0 1 0 0 0 ! +section text 0 1 0 1 1 1 1 1 3400 3400 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 1 0 1 0 1 0 1 data data ! +section data 0 8 0 1 0 1 0 1 sbss sbss ! +section sbss 0 4 0 1 0 1 0 1 bss bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 !
--- a/packages/io/eth/current/ChangeLog +++ b/packages/io/eth/current/ChangeLog @@ -1,3 +1,8 @@ +2002-05-30 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/eth_drivers.cdl: Provide CYGINT_IO_ETH_INT_SUPPORT_REQUIRED + interface to indicate if interrupt support is required. + 2002-05-28 Jonathan Larmour <jlarmour@redhat.com> * src/lwip/lw.diff: Remove. Obsolete.
--- a/packages/io/eth/current/cdl/eth_drivers.cdl +++ b/packages/io/eth/current/cdl/eth_drivers.cdl @@ -91,6 +91,7 @@ cdl_package CYGPKG_IO_ETH_DRIVERS { flavor bool active_if CYGPKG_NET requires CYGINT_ISO_STRING_STRFUNCS + implements CYGINT_IO_ETH_INT_SUPPORT_REQUIRED default_value 1 compile net/eth_drv.c @@ -201,9 +202,18 @@ cdl_package CYGPKG_IO_ETH_DRIVERS { requires !CYGPKG_NET active_if CYGPKG_NET_LWIP default_value 1 + implements CYGINT_IO_ETH_INT_SUPPORT_REQUIRED compile lwip/eth_drv.c } + cdl_interface CYGINT_IO_ETH_INT_SUPPORT_REQUIRED { + display "Interrupt support required" + flavor booldata + description "This interface is used to indicate to the low + level device drivers that interrupt driven operation + is required by higher layers." + } + cdl_component CYGPKG_IO_ETH_DRIVERS_OPTIONS { display "Common ethernet support build options" flavor none
--- a/packages/net/common/current/ChangeLog +++ b/packages/net/common/current/ChangeLog @@ -1,3 +1,7 @@ +2002-05-30 Jesper Skov <jskov@redhat.com> + + * tests/flood.c (floodsend): Fixed warning. + 2002-05-28 Jonathan Larmour <jlarmour@redhat.com> * src/dhcp_prot.c (do_dhcp): xmit2 need not be static.
--- a/packages/net/common/current/src/inet_pton.c +++ b/packages/net/common/current/src/inet_pton.c @@ -39,7 +39,7 @@ */ //#if defined(LIBC_SCCS) && !defined(lint) -//static char rcsid[] = "$Id: inet_pton.c,v 1.4 2002/03/06 15:20:46 gthomas Exp $"; +//static char rcsid[] = "$Id: inet_pton.c,v 1.3 2002/02/20 17:39:39 gthomas Exp $"; //#endif /* LIBC_SCCS and not lint */ //#ifdef HAVE_CONFIG_H
--- a/packages/net/common/current/tests/bridge.c +++ b/packages/net/common/current/tests/bridge.c @@ -67,6 +67,7 @@ #include <network.h> #include <sys/types.h> #include <stdlib.h> +#ifdef CYGPKG_NET_BRIDGE #include <net/if.h> #include <net/if_dl.h> #include <netinet/in.h> @@ -983,4 +984,11 @@ cyg_user_start(void) { printf("cyg_user_start done\n"); } +#else // CYGPKG_NET_BRIDGE +void +cyg_user_start(void) { + printf("No bridge support available\n"); +} +#endif +
--- a/packages/net/common/current/tests/flood.c +++ b/packages/net/common/current/tests/flood.c @@ -266,10 +266,14 @@ pingsend( int seq, struct sockaddr_in *h static void floodsend(cyg_addrword_t param) { - unsigned char pkt0[MAX_PACKET], pkt1[MAX_PACKET]; - +#ifdef CYGHWR_NET_DRIVER_ETH0 + unsigned char pkt0[MAX_PACKET]; struct icmp *icmp0 = (struct icmp *)pkt0; +#endif +#ifdef CYGHWR_NET_DRIVER_ETH1 + unsigned char pkt1[MAX_PACKET]; struct icmp *icmp1 = (struct icmp *)pkt1; +#endif int icmp_len = 64; int seq;
--- a/packages/net/common/current/tests/tcp_echo.c +++ b/packages/net/common/current/tests/tcp_echo.c @@ -65,9 +65,13 @@ // Network throughput test code -#include <lib/libkern/libkern.h> +#include <network.h> -#include <network.h> +static __inline__ int +max(int m, int n) +{ + return m > n ? m : n; +} #define SOURCE_PORT 9990 #define SINK_PORT 9991
--- a/packages/net/ns/dns/current/ChangeLog +++ b/packages/net/ns/dns/current/ChangeLog @@ -1,3 +1,7 @@ +2002-05-30 Jesper Skov <jskov@redhat.com> + + * src/dns.c: fixed index->ptdindex oversight. + 2002-05-24 Jonathan Larmour <jlarmour@redhat.com> * src/dns.c (free_hent): Actually free hent itself!
--- a/packages/net/ns/dns/current/src/dns.c +++ b/packages/net/ns/dns/current/src/dns.c @@ -149,7 +149,7 @@ static void thread_destructor(CYG_ADDRWORD data) { struct hostent *hent; - hent = (struct hostent *)cyg_thread_get_data(index); + hent = (struct hostent *)cyg_thread_get_data(ptdindex); if (hent) free_hent(hent); return; @@ -163,7 +163,7 @@ store_hent(struct hostent *hent) // Prevent memory leaks by setting a destructor to be // called on thread exit to free per-thread data. cyg_thread_add_destructor( &thread_destructor, 0 ); - cyg_thread_set_data(index, (CYG_ADDRWORD)hent); + cyg_thread_set_data(ptdindex, (CYG_ADDRWORD)hent); } /* If there is an answer to an old query, free the memory it uses. */ @@ -171,10 +171,10 @@ static void free_stored_hent(void) { struct hostent *hent; - hent = (struct hostent *)cyg_thread_get_data(index); + hent = (struct hostent *)cyg_thread_get_data(ptdindex); if (hent) { free_hent(hent); - cyg_thread_set_data(index, (CYG_ADDRWORD)NULL); + cyg_thread_set_data(ptdindex, (CYG_ADDRWORD)NULL); cyg_thread_rem_destructor( &thread_destructor, 0 ); } }
--- a/packages/redboot/current/doc/redboot_cmds.sgml +++ b/packages/redboot/current/doc/redboot_cmds.sgml @@ -756,7 +756,7 @@ 0xFE00B080: 45 6E 74 72 79 20 70 6F 69 </refentry> <!-- ******** help *************************************************** --> - <refentry> + <refentry id="help-command"> <refnamediv> <refname>help</refname> <refpurpose>Display help on available commands</refpurpose>
