doc/doxygen/html/can__socket_8c-source.html
author etisserant
Mon, 02 Jul 2007 18:22:58 +0200
changeset 236 905677ed00f3
parent 215 f49e5a6b7804
child 240 34654679f262
permissions -rw-r--r--
Full preliminary implementation of TPDO transmit type:
- SYNC (N) (1-240)
- RTR only + SYNC (252)
- RTR only (253)
- EVENT, with timer and inhibit time (254 and 255)

User app have to call sendPDOevent(d) to eventually signal mapped data changes.
Callbacks added to 0x140N, TPDO comm parameters for on the fly timers values change.
TestMasterSlave updated.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>CanFestival: drivers/can_socket/can_socket.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.1 -->
<div class="tabs">
  <ul>
    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="dirs.html"><span>Directories</span></a></li>
  </ul></div>
<div class="tabs">
  <ul>
    <li><a href="files.html"><span>File&nbsp;List</span></a></li>
    <li><a href="globals.html"><span>Globals</span></a></li>
  </ul></div>
<div class="nav">
<a class="el" href="dir_d58fb241e647de6212c31ecccf9cbace.html">drivers</a>&nbsp;&raquo&nbsp;<a class="el" href="dir_60bd150a90237f89382bb02bbf915860.html">can_socket</a></div>
<h1>can_socket.c</h1><a href="can__socket_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">This file is part of CanFestival, a library implementing CanOpen Stack.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment">Copyright (C): Edouard TISSERANT and Francis DUPIN</span>
<a name="l00005"></a>00005 <span class="comment"></span>
<a name="l00006"></a>00006 <span class="comment">See COPYING file for copyrights details.</span>
<a name="l00007"></a>00007 <span class="comment"></span>
<a name="l00008"></a>00008 <span class="comment">This library is free software; you can redistribute it and/or</span>
<a name="l00009"></a>00009 <span class="comment">modify it under the terms of the GNU Lesser General Public</span>
<a name="l00010"></a>00010 <span class="comment">License as published by the Free Software Foundation; either</span>
<a name="l00011"></a>00011 <span class="comment">version 2.1 of the License, or (at your option) any later version.</span>
<a name="l00012"></a>00012 <span class="comment"></span>
<a name="l00013"></a>00013 <span class="comment">This library is distributed in the hope that it will be useful,</span>
<a name="l00014"></a>00014 <span class="comment">but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00015"></a>00015 <span class="comment">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00016"></a>00016 <span class="comment">Lesser General Public License for more details.</span>
<a name="l00017"></a>00017 <span class="comment"></span>
<a name="l00018"></a>00018 <span class="comment">You should have received a copy of the GNU Lesser General Public</span>
<a name="l00019"></a>00019 <span class="comment">License along with this library; if not, write to the Free Software</span>
<a name="l00020"></a>00020 <span class="comment">Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</span>
<a name="l00021"></a>00021 <span class="comment">*/</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;string.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;stddef.h&gt;</span>             <span class="comment">/* for NULL */</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;errno.h&gt;</span>
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 <span class="preprocessor">#include "<a class="code" href="win32_2config_8h.html">config.h</a>"</span>
<a name="l00030"></a>00030 
<a name="l00031"></a>00031 <span class="preprocessor">#ifdef RTCAN_SOCKET</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#include "rtdm/rtcan.h"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#define CAN_IFNAME     "rtcan%s"</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#define CAN_SOCKET     rt_dev_socket</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define CAN_CLOSE      rt_dev_close</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define CAN_RECV       rt_dev_recv</span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define CAN_SEND       rt_dev_send</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#define CAN_BIND       rt_dev_bind</span>
<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#define CAN_IOCTL      rt_dev_ioctl</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define CAN_ERRNO(err) (-err)</span>
<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/socket.h&gt;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include &lt;sys/ioctl.h&gt;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include "linux/can.h"</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include "linux/can/raw.h"</span>
<a name="l00046"></a>00046 <span class="preprocessor">#include "net/if.h"</span>
<a name="l00047"></a><a class="code" href="can__socket_8c.html#eac0c3db7a1e021f17987bcc76893849">00047</a> <span class="preprocessor">#define PF_CAN 29</span>
<a name="l00048"></a><a class="code" href="can__socket_8c.html#546620c7e758f003b24b7fdae4f97bd4">00048</a> <span class="preprocessor"></span><span class="preprocessor">#define AF_CAN PF_CAN</span>
<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="comment">//#include "af_can.h"</span>
<a name="l00050"></a><a class="code" href="can__socket_8c.html#b0e2c857f77f55e9d76239af529340ef">00050</a> <span class="preprocessor">#define CAN_IFNAME     "can%s"</span>
<a name="l00051"></a><a class="code" href="can__socket_8c.html#3947ec96c2f7841c6a25f0d2b9989597">00051</a> <span class="preprocessor"></span><span class="preprocessor">#define CAN_SOCKET     socket</span>
<a name="l00052"></a><a class="code" href="can__socket_8c.html#4a4bdc94205926096ef572a540e4d025">00052</a> <span class="preprocessor"></span><span class="preprocessor">#define CAN_CLOSE      close</span>
<a name="l00053"></a><a class="code" href="can__socket_8c.html#b78c6a888be103b97e95bfc85f5da083">00053</a> <span class="preprocessor"></span><span class="preprocessor">#define CAN_RECV       recv</span>
<a name="l00054"></a><a class="code" href="can__socket_8c.html#70c9889a227060d2e902e298858c1f36">00054</a> <span class="preprocessor"></span><span class="preprocessor">#define CAN_SEND       send</span>
<a name="l00055"></a><a class="code" href="can__socket_8c.html#f51a5befd644cec65f24d3502b31d630">00055</a> <span class="preprocessor"></span><span class="preprocessor">#define CAN_BIND       bind</span>
<a name="l00056"></a><a class="code" href="can__socket_8c.html#56776428046c869321581cd587514964">00056</a> <span class="preprocessor"></span><span class="preprocessor">#define CAN_IOCTL      ioctl</span>
<a name="l00057"></a><a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">00057</a> <span class="preprocessor"></span><span class="preprocessor">#define CAN_ERRNO(err) errno</span>
<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00059"></a>00059 <span class="preprocessor"></span>
<a name="l00060"></a>00060 <span class="preprocessor">#include "<a class="code" href="can__driver_8h.html">can_driver.h</a>"</span>
<a name="l00061"></a>00061 
<a name="l00062"></a>00062 <span class="comment">/*********functions which permit to communicate with the board****************/</span>
<a name="l00063"></a>00063 <a class="code" href="hcs12_2applicfg_8h.html#539234687760592d01a8b0d3357bc00e">UNS8</a>
<a name="l00064"></a><a class="code" href="can__socket_8c.html#6b3248e95acf2b08d1fd8b42610cc5a6">00064</a> <a class="code" href="can__lincan_8c.html#6b3248e95acf2b08d1fd8b42610cc5a6">canReceive_driver</a> (<a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0, <a class="code" href="structMessage.html">Message</a> * m)
<a name="l00065"></a>00065 {
<a name="l00066"></a>00066   <span class="keywordtype">int</span> res;
<a name="l00067"></a>00067   <span class="keyword">struct </span>can_frame frame;
<a name="l00068"></a>00068 
<a name="l00069"></a>00069   res = <a class="code" href="can__socket_8c.html#b78c6a888be103b97e95bfc85f5da083">CAN_RECV</a> (*(<span class="keywordtype">int</span> *) fd0, &amp;frame, <span class="keyword">sizeof</span> (frame), 0);
<a name="l00070"></a>00070   <span class="keywordflow">if</span> (res &lt; 0)
<a name="l00071"></a>00071     {
<a name="l00072"></a>00072       fprintf (stderr, <span class="stringliteral">"Recv failed: %s\n"</span>, strerror (<a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">CAN_ERRNO</a> (res)));
<a name="l00073"></a>00073       <span class="keywordflow">return</span> 1;
<a name="l00074"></a>00074     }
<a name="l00075"></a>00075 
<a name="l00076"></a>00076   m-&gt;<a class="code" href="structMessage.html#c5d40bde75d015beb48293c052a218b5">cob_id</a>.<a class="code" href="structSHORT__CAN.html#614e1c6a40f1261e2b15ad69b19e9698">w</a> = frame.can_id &amp; CAN_EFF_MASK;
<a name="l00077"></a>00077   m-&gt;<a class="code" href="structMessage.html#d1dd9a88dda088ff4c7073d49613613d">len</a> = frame.can_dlc;
<a name="l00078"></a>00078   <span class="keywordflow">if</span> (frame.can_id &amp; CAN_RTR_FLAG)
<a name="l00079"></a>00079     m-&gt;<a class="code" href="structMessage.html#41c5a4e7eaeb2c2ae1af2b2c83129615">rtr</a> = 1;
<a name="l00080"></a>00080   <span class="keywordflow">else</span>
<a name="l00081"></a>00081     m-&gt;<a class="code" href="structMessage.html#41c5a4e7eaeb2c2ae1af2b2c83129615">rtr</a> = 0;
<a name="l00082"></a>00082   memcpy (m-&gt;<a class="code" href="structMessage.html#229865b09691e658677ba76f2d82ce89">data</a>, frame.data, 8);
<a name="l00083"></a>00083 
<a name="l00084"></a>00084   <span class="keywordflow">return</span> 0;
<a name="l00085"></a>00085 }
<a name="l00086"></a>00086 
<a name="l00087"></a>00087 
<a name="l00088"></a>00088 <span class="comment">/***************************************************************************/</span>
<a name="l00089"></a>00089 <a class="code" href="hcs12_2applicfg_8h.html#539234687760592d01a8b0d3357bc00e">UNS8</a>
<a name="l00090"></a><a class="code" href="can__socket_8c.html#def95aee49efa13dd047d0b3b5507ad3">00090</a> <a class="code" href="can__lincan_8c.html#def95aee49efa13dd047d0b3b5507ad3">canSend_driver</a> (<a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0, <a class="code" href="structMessage.html">Message</a> * m)
<a name="l00091"></a>00091 {
<a name="l00092"></a>00092   <span class="keywordtype">int</span> res;
<a name="l00093"></a>00093   <span class="keyword">struct </span>can_frame frame;
<a name="l00094"></a>00094 
<a name="l00095"></a>00095   frame.can_id = m-&gt;<a class="code" href="structMessage.html#c5d40bde75d015beb48293c052a218b5">cob_id</a>.<a class="code" href="structSHORT__CAN.html#614e1c6a40f1261e2b15ad69b19e9698">w</a>;
<a name="l00096"></a>00096   <span class="keywordflow">if</span> (frame.can_id &gt;= 0x800)
<a name="l00097"></a>00097     frame.can_id |= CAN_EFF_FLAG;
<a name="l00098"></a>00098   frame.can_dlc = m-&gt;<a class="code" href="structMessage.html#d1dd9a88dda088ff4c7073d49613613d">len</a>;
<a name="l00099"></a>00099   <span class="keywordflow">if</span> (m-&gt;<a class="code" href="structMessage.html#41c5a4e7eaeb2c2ae1af2b2c83129615">rtr</a>)
<a name="l00100"></a>00100     frame.can_id |= CAN_RTR_FLAG;
<a name="l00101"></a>00101   <span class="keywordflow">else</span>
<a name="l00102"></a>00102     memcpy (frame.data, m-&gt;<a class="code" href="structMessage.html#229865b09691e658677ba76f2d82ce89">data</a>, 8);
<a name="l00103"></a>00103 
<a name="l00104"></a>00104   res = <a class="code" href="can__socket_8c.html#70c9889a227060d2e902e298858c1f36">CAN_SEND</a> (*(<span class="keywordtype">int</span> *) fd0, &amp;frame, <span class="keyword">sizeof</span> (frame), 0);
<a name="l00105"></a>00105   <span class="keywordflow">if</span> (res &lt; 0)
<a name="l00106"></a>00106     {
<a name="l00107"></a>00107       fprintf (stderr, <span class="stringliteral">"Send failed: %s\n"</span>, strerror (<a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">CAN_ERRNO</a> (res)));
<a name="l00108"></a>00108       <span class="keywordflow">return</span> 1;
<a name="l00109"></a>00109     }
<a name="l00110"></a>00110 
<a name="l00111"></a>00111   <span class="keywordflow">return</span> 0;
<a name="l00112"></a>00112 }
<a name="l00113"></a>00113 
<a name="l00114"></a>00114 <span class="comment">/***************************************************************************/</span>
<a name="l00115"></a>00115 <span class="preprocessor">#ifdef RTCAN_SOCKET</span>
<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="keywordtype">int</span>
<a name="l00117"></a>00117 TranslateBaudRate (<span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="TestMasterSlave_2getopt_8c.html#db50a0eab9fed92fc3bfc7dfa4f2c410">optarg</a>)
<a name="l00118"></a>00118 {
<a name="l00119"></a>00119   <span class="keywordtype">int</span> baudrate;
<a name="l00120"></a>00120   <span class="keywordtype">int</span> val, len;
<a name="l00121"></a>00121   <span class="keywordtype">char</span> *pos = NULL;
<a name="l00122"></a>00122 
<a name="l00123"></a>00123   len = strlen (optarg);
<a name="l00124"></a>00124   <span class="keywordflow">if</span> (!len)
<a name="l00125"></a>00125     <span class="keywordflow">return</span> 0;
<a name="l00126"></a>00126 
<a name="l00127"></a>00127   <span class="keywordflow">switch</span> ((<span class="keywordtype">int</span>) optarg[len - 1])
<a name="l00128"></a>00128     {
<a name="l00129"></a>00129     <span class="keywordflow">case</span> <span class="charliteral">'M'</span>:
<a name="l00130"></a>00130       baudrate = 1000000;
<a name="l00131"></a>00131       <span class="keywordflow">break</span>;
<a name="l00132"></a>00132     <span class="keywordflow">case</span> <span class="charliteral">'K'</span>:
<a name="l00133"></a>00133       baudrate = 1000;
<a name="l00134"></a>00134       <span class="keywordflow">break</span>;
<a name="l00135"></a>00135     <span class="keywordflow">default</span>:
<a name="l00136"></a>00136       baudrate = 1;
<a name="l00137"></a>00137       <span class="keywordflow">break</span>;
<a name="l00138"></a>00138     }
<a name="l00139"></a>00139   <span class="keywordflow">if</span> ((sscanf (optarg, <span class="stringliteral">"%i"</span>, &amp;val)) == 1)
<a name="l00140"></a>00140     baudrate *= val;
<a name="l00141"></a>00141   <span class="keywordflow">else</span>
<a name="l00142"></a>00142     baudrate = 0;;
<a name="l00143"></a>00143 
<a name="l00144"></a>00144   <span class="keywordflow">return</span> baudrate;
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146 <span class="preprocessor">#endif</span>
<a name="l00147"></a>00147 <span class="preprocessor"></span>
<a name="l00148"></a>00148 <span class="comment">/***************************************************************************/</span>
<a name="l00149"></a>00149 <a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a>
<a name="l00150"></a><a class="code" href="can__socket_8c.html#945403aba7f36acbd2e7160ade361bab">00150</a> <a class="code" href="can__lincan_8c.html#945403aba7f36acbd2e7160ade361bab">canOpen_driver</a> (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> * board)
<a name="l00151"></a>00151 {
<a name="l00152"></a>00152   <span class="keyword">struct </span>ifreq ifr;
<a name="l00153"></a>00153   <span class="keyword">struct </span>sockaddr_can addr;
<a name="l00154"></a>00154   <span class="keywordtype">int</span> err;
<a name="l00155"></a>00155   <a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0 = malloc (<span class="keyword">sizeof</span> (<span class="keywordtype">int</span>));
<a name="l00156"></a>00156 <span class="preprocessor">#ifdef RTCAN_SOCKET</span>
<a name="l00157"></a>00157 <span class="preprocessor"></span>  can_baudrate_t *baudrate;
<a name="l00158"></a>00158   can_mode_t *mode;
<a name="l00159"></a>00159 <span class="preprocessor">#endif</span>
<a name="l00160"></a>00160 <span class="preprocessor"></span>
<a name="l00161"></a>00161   *(<span class="keywordtype">int</span> *) fd0 = <a class="code" href="can__socket_8c.html#3947ec96c2f7841c6a25f0d2b9989597">CAN_SOCKET</a> (<a class="code" href="can__socket_8c.html#eac0c3db7a1e021f17987bcc76893849">PF_CAN</a>, SOCK_RAW, CAN_RAW);
<a name="l00162"></a>00162   <span class="keywordflow">if</span> (*(<span class="keywordtype">int</span> *) fd0 &lt; 0)
<a name="l00163"></a>00163     {
<a name="l00164"></a>00164       fprintf (stderr, <span class="stringliteral">"Socket creation failed: %s\n"</span>,
<a name="l00165"></a>00165                strerror (<a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">CAN_ERRNO</a> (*(<span class="keywordtype">int</span> *) fd0)));
<a name="l00166"></a>00166       <span class="keywordflow">goto</span> error_ret;
<a name="l00167"></a>00167     }
<a name="l00168"></a>00168 
<a name="l00169"></a>00169   <span class="keywordflow">if</span> (*board-&gt;<a class="code" href="structstruct__s__BOARD.html#fb28847fd702021b624afe1f7d4b25b2">busname</a> &gt;= <span class="charliteral">'0'</span> &amp;&amp; *board-&gt;<a class="code" href="structstruct__s__BOARD.html#fb28847fd702021b624afe1f7d4b25b2">busname</a> &lt;= <span class="charliteral">'9'</span>)
<a name="l00170"></a>00170     snprintf (ifr.ifr_name, IFNAMSIZ, <a class="code" href="can__socket_8c.html#b0e2c857f77f55e9d76239af529340ef">CAN_IFNAME</a>, board-&gt;<a class="code" href="structstruct__s__BOARD.html#fb28847fd702021b624afe1f7d4b25b2">busname</a>);
<a name="l00171"></a>00171   <span class="keywordflow">else</span>
<a name="l00172"></a>00172     strncpy (ifr.ifr_name, board-&gt;<a class="code" href="structstruct__s__BOARD.html#fb28847fd702021b624afe1f7d4b25b2">busname</a>, IFNAMSIZ);
<a name="l00173"></a>00173   err = <a class="code" href="can__socket_8c.html#56776428046c869321581cd587514964">CAN_IOCTL</a> (*(<span class="keywordtype">int</span> *) fd0, SIOCGIFINDEX, &amp;ifr);
<a name="l00174"></a>00174   <span class="keywordflow">if</span> (err)
<a name="l00175"></a>00175     {
<a name="l00176"></a>00176       fprintf (stderr, <span class="stringliteral">"Getting IF index for %s failed: %s\n"</span>,
<a name="l00177"></a>00177                ifr.ifr_name, strerror (<a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">CAN_ERRNO</a> (err)));
<a name="l00178"></a>00178       <span class="keywordflow">goto</span> error_close;
<a name="l00179"></a>00179     }
<a name="l00180"></a>00180 
<a name="l00181"></a>00181   addr.can_family = <a class="code" href="can__socket_8c.html#546620c7e758f003b24b7fdae4f97bd4">AF_CAN</a>;
<a name="l00182"></a>00182   addr.can_ifindex = ifr.ifr_ifindex;
<a name="l00183"></a>00183   err = <a class="code" href="can__socket_8c.html#f51a5befd644cec65f24d3502b31d630">CAN_BIND</a> (*(<span class="keywordtype">int</span> *) fd0, (<span class="keyword">struct</span> sockaddr *) &amp;addr, <span class="keyword">sizeof</span> (addr));
<a name="l00184"></a>00184   <span class="keywordflow">if</span> (err)
<a name="l00185"></a>00185     {
<a name="l00186"></a>00186       fprintf (stderr, <span class="stringliteral">"Binding failed: %s\n"</span>, strerror (<a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">CAN_ERRNO</a> (err)));
<a name="l00187"></a>00187       <span class="keywordflow">goto</span> error_close;
<a name="l00188"></a>00188     }
<a name="l00189"></a>00189 
<a name="l00190"></a>00190 <span class="preprocessor">#ifdef RTCAN_SOCKET</span>
<a name="l00191"></a>00191 <span class="preprocessor"></span>  baudrate = (can_baudrate_t *) &amp; ifr.ifr_ifru;
<a name="l00192"></a>00192   *baudrate = TranslateBaudRate (board-&gt;<a class="code" href="structstruct__s__BOARD.html#5316679ded23cf846c63c06ab51a4646">baudrate</a>);
<a name="l00193"></a>00193   <span class="keywordflow">if</span> (!*baudrate)
<a name="l00194"></a>00194     <span class="keywordflow">goto</span> error_close;
<a name="l00195"></a>00195 
<a name="l00196"></a>00196   err = <a class="code" href="can__socket_8c.html#56776428046c869321581cd587514964">CAN_IOCTL</a> (*(<span class="keywordtype">int</span> *) fd0, SIOCSCANBAUDRATE, &amp;ifr);
<a name="l00197"></a>00197   <span class="keywordflow">if</span> (err)
<a name="l00198"></a>00198     {
<a name="l00199"></a>00199       fprintf (stderr,
<a name="l00200"></a>00200                <span class="stringliteral">"Setting baudrate %d failed: %s\n"</span>,
<a name="l00201"></a>00201                *baudrate, strerror (<a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">CAN_ERRNO</a> (err)));
<a name="l00202"></a>00202       <span class="keywordflow">goto</span> error_close;
<a name="l00203"></a>00203     }
<a name="l00204"></a>00204 
<a name="l00205"></a>00205   mode = (can_mode_t *) &amp; ifr.ifr_ifru;
<a name="l00206"></a>00206   *mode = CAN_MODE_START;
<a name="l00207"></a>00207   err = <a class="code" href="can__socket_8c.html#56776428046c869321581cd587514964">CAN_IOCTL</a> (*(<span class="keywordtype">int</span> *) fd0, SIOCSCANMODE, &amp;ifr);
<a name="l00208"></a>00208   <span class="keywordflow">if</span> (err)
<a name="l00209"></a>00209     {
<a name="l00210"></a>00210       fprintf (stderr, <span class="stringliteral">"Starting CAN device failed: %s\n"</span>,
<a name="l00211"></a>00211                strerror (<a class="code" href="can__socket_8c.html#e9e218c73b4cb73965e4412c4d50eb2e">CAN_ERRNO</a> (err)));
<a name="l00212"></a>00212       <span class="keywordflow">goto</span> error_close;
<a name="l00213"></a>00213     }
<a name="l00214"></a>00214 <span class="preprocessor">#endif</span>
<a name="l00215"></a>00215 <span class="preprocessor"></span>
<a name="l00216"></a>00216   <span class="keywordflow">return</span> fd0;
<a name="l00217"></a>00217 
<a name="l00218"></a>00218 error_close:
<a name="l00219"></a>00219   <a class="code" href="can__socket_8c.html#4a4bdc94205926096ef572a540e4d025">CAN_CLOSE</a> (*(<span class="keywordtype">int</span> *) fd0);
<a name="l00220"></a>00220 
<a name="l00221"></a>00221 error_ret:
<a name="l00222"></a>00222   free (fd0);
<a name="l00223"></a>00223   <span class="keywordflow">return</span> NULL;
<a name="l00224"></a>00224 }
<a name="l00225"></a>00225 
<a name="l00226"></a>00226 <span class="comment">/***************************************************************************/</span>
<a name="l00227"></a>00227 <span class="keywordtype">int</span>
<a name="l00228"></a><a class="code" href="can__socket_8c.html#76e6a915d0e40a23b863198b2aaa5545">00228</a> <a class="code" href="can__lincan_8c.html#76e6a915d0e40a23b863198b2aaa5545">canClose_driver</a> (<a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0)
<a name="l00229"></a>00229 {
<a name="l00230"></a>00230   <span class="keywordflow">if</span> (fd0)
<a name="l00231"></a>00231     {
<a name="l00232"></a>00232       <a class="code" href="can__socket_8c.html#4a4bdc94205926096ef572a540e4d025">CAN_CLOSE</a> (*(<span class="keywordtype">int</span> *) fd0);
<a name="l00233"></a>00233       free (fd0);
<a name="l00234"></a>00234     }
<a name="l00235"></a>00235   <span class="keywordflow">return</span> 0;
<a name="l00236"></a>00236 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Fri Jun 8 08:51:38 2007 for CanFestival by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
</body>
</html>