flexcan.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: flexcan.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2025-09-28
  7. 功能说明: FLEXCAN驱动
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "bspconfig.h"
  14. #include "rt_printf.h"
  15. #include "ustimer.h"
  16. #include "rt.h"
  17. #include "flexcan.h"
  18. #include <string.h>
  19. #include <sys/mman.h>
  20. #include <sys/socket.h>
  21. #include <sys/ioctl.h>
  22. #include <linux/can.h>
  23. #include <linux/can/raw.h>
  24. #include <sys/prctl.h>
  25. #include <unistd.h>
  26. #ifdef BSP_CAN_ENABLE
  27. /*------------------------------- 宏定义 --------------------------------------
  28. */
  29. #define CAN_FIFO
  30. // 优先级
  31. #define CAN_PRIO_MAX 4
  32. // 短帧BUF
  33. #define CAN_FRAME_NUM 256 // CAN短帧BUF数量
  34. #define CAN_FRAME_LEN 16 // CAN短帧BUF长度
  35. #define CAN_FRAME_HEAD_LEN 8 // CAN短帧帧头长度
  36. #define CAN_FRAME_DATA_LEN 8 // CAN短帧数据长度
  37. // 长帧BUF
  38. #define CAN_LONGFRAME_NUM 16 // CAN长帧BUF数量
  39. #define CAN_LONGFRAME_LEN CAN_FRAME_LEN_MAX // CAN长帧BUF长度
  40. #define CAN_LONGFRAME_HEAD_LEN 4 // CAN长帧头长度
  41. #define CAN_LONGFRAME_DATA_LEN (CAN_LONGFRAME_LEN-CAN_LONGFRAME_HEAD_LEN) // CAN长帧数据长度
  42. // 帧标志,数字越小,优先级越高
  43. #define CAN_FRAME_SINGLE 0 // 单帧(既是起始帧,又是结束帧)
  44. #define CAN_FRAME_END 1 // 结束帧
  45. #define CAN_FRAME_MIDDLE 2 // 中间帧
  46. #define CAN_FRAME_BEGIN 3 // 开始帧
  47. //帧ID中各个域的位偏移
  48. #define CAN_FRAME_OFFSET_SN 0 // 帧序号偏移
  49. #define CAN_FRAME_OFFSET_MARK 6 // 帧标志偏移
  50. #define CAN_FRAME_OFFSET_SRC 8 // 帧源地址偏移
  51. #define CAN_FRAME_OFFSET_DST 12 // 帧目的地址偏移
  52. #define CAN_FRAME_OFFSET_TYPE 16 // 帧类型偏移
  53. #define CAN_FRAME_OFFSET_PRIOR 23 // 帧优先级偏移(帧优先级是帧类型的高2位)
  54. #define CAN_FRAME_OFFSET_LEN 16 // 帧长度偏移
  55. #define CAN_FRAME_MASK_SN 0X3F // 帧序号屏蔽位
  56. #define CAN_FRAME_MASK_MARK 0X03 // 帧标志屏蔽位
  57. #define CAN_FRAME_MASK_SRC 0X0F // 帧源地址屏蔽位
  58. #define CAN_FRAME_MASK_DST 0X0F // 帧目的地址屏蔽位
  59. #define CAN_FRAME_MASK_TYPE 0XFF // 帧类型屏蔽位
  60. #define CAN_FRAME_MASK_PRIOR 0X03 // 帧优先级屏蔽位(帧优先级是帧类型的高2位)
  61. #define CAN_FRAME_MASK_LEN 0X0F // 帧长度屏蔽位
  62. //缓冲区为空
  63. #define CAN_BUF_EMPTY(ring) ((ring)->head == (ring)->tail)
  64. //缓冲区满
  65. #define CAN_BUF_FULL(ring, size) (((unsigned char)((ring)->head - (ring)->tail))==((unsigned char)(size-1)))
  66. //缓冲区剩余空间
  67. #define CAN_BUF_SPACE(ring, size) (((unsigned char)((ring)->tail - (ring)->head) -1) & (unsigned char)(size-1))
  68. //强制中断寄存器
  69. #define REG_MCF_INTFRCL1 (*( volatile unsigned int*)(0xFC04C014))
  70. // 调试开关
  71. // #define CAN_DEBUG
  72. #ifdef CAN_DEBUG
  73. # define can_printf(x...) rt_printf(x)
  74. #else
  75. # define can_printf(x...)
  76. #endif
  77. // 打印报文
  78. #ifdef CAN_DEBUG
  79. # define can_print_mem(x...) print_mem_time(x)
  80. #else
  81. # define can_print_mem(x...)
  82. #endif
  83. /*------------------------------ 类型结构 -------------------------------------
  84. */
  85. typedef enum
  86. {
  87. CAN_1,
  88. CAN_2,
  89. CAN_RES
  90. }can_type;
  91. //CANFD 基地址
  92. static unsigned int g_rt_canfd_baseaddr[RT_CAN_NUM][RT_CAN_DEV_TYPE]=
  93. {
  94. {RT_M_CAN0, RT_M_RAM0, RT_M_TOP0, RT_M_DMA0},
  95. {RT_M_CAN1, RT_M_RAM1, RT_M_TOP1, RT_M_DMA1},
  96. {RT_M_CAN2, RT_M_RAM2, RT_M_TOP2, RT_M_DMA2},
  97. {RT_M_CAN3, RT_M_RAM3, RT_M_TOP3, RT_M_DMA3},
  98. };
  99. // 保证所有结构的大小都是4的倍数
  100. //长帧缓冲区
  101. struct can_longframe_buf
  102. {
  103. unsigned char head;//头位置
  104. unsigned char tail;//尾位置
  105. unsigned char reserverd[2];
  106. unsigned char buf[CAN_LONGFRAME_NUM][CAN_LONGFRAME_LEN];
  107. };
  108. //缓冲区描述符
  109. struct can_buf
  110. {
  111. unsigned char head; //头位置
  112. unsigned char tail; //尾位置
  113. unsigned char frameno; //帧序号
  114. unsigned char reserverd;
  115. unsigned char buf[CAN_FRAME_NUM][CAN_FRAME_LEN];
  116. };
  117. //CAN统计信息数据结构
  118. struct can_dev_stats{
  119. uint32_t rx_shortframes; //接收短帧数
  120. uint32_t tx_shortframes; //发送短帧数
  121. uint32_t rx_longframes; //接收长帧数
  122. uint32_t tx_longframes; //发送长帧数
  123. uint32_t rx_dropped; //接收缓冲区满溢出次数
  124. uint32_t tx_dropped; //发送缓冲区满溢出次数
  125. uint32_t hw_bus_errors;
  126. uint32_t overrun;
  127. uint32_t max_mbcnt; //统计最大的未处理的MB个数
  128. uint32_t max_proctime; //处理MB的最大时间
  129. };
  130. #if 0
  131. //短帧描述符
  132. struct can_shortframe_des
  133. {
  134. unsigned char info;
  135. unsigned char flag1;
  136. unsigned char srcaddr;
  137. unsigned char dstaddr;
  138. unsigned char frameno;
  139. unsigned char data[8];
  140. unsigned char reserved[3];
  141. };
  142. #endif
  143. //时间戳差值数据结构
  144. struct can_timestamp
  145. {
  146. unsigned short timestamp; //时间戳差值,该差值是指当前时间戳与有数据的MB的时间戳差值
  147. short caniflg_bit; //MB下标即是那一个MB
  148. };
  149. //flexcan 设备数据结构
  150. struct can_dev
  151. {
  152. int can_sock;
  153. uint32_t no;
  154. uint32_t base_addr;
  155. struct can_dev_stats stats; //网络统计信息
  156. struct can_timestamp ts[CAN_MB]; //记录各时间戳差值
  157. struct can_buf tx_buf[CAN_PRIO_MAX]; //发送缓冲区
  158. struct can_buf rx_buf[CAN_PRIO_MAX]; //接收缓冲区
  159. struct can_longframe_buf longframe_buf_rx[CAN_PRIO_MAX]; //接收长帧缓冲区
  160. };
  161. /* Message type access macros.*/
  162. #define FLEXCAN_SET_MODE_RETRIES 255
  163. /* Message Buffer 0 configure as Tx */
  164. #define SEND_BUF 15
  165. #define SEND_BUF_BIT (1<<SEND_BUF)
  166. /* Structure of the message buffer */
  167. struct can_mb
  168. {
  169. volatile u32 can_dlc;
  170. volatile u32 can_id;
  171. u8 data[8];
  172. };
  173. struct can_regs
  174. {
  175. volatile u32 canmcr; /* FLEXCAN 0x00 */
  176. volatile u32 canctrl; /* FLEXCAN 0x04 */
  177. volatile u32 cantimer; /* FLEXCAN 0x08 */
  178. volatile u32 reserved1;
  179. volatile u32 canrxgmsk; /* FLEXCAN 0x10 */
  180. volatile u32 canrx14msk; /* FLEXCAN 0x14 */
  181. volatile u32 canrx15msk; /* FLEXCAN 0x18 */
  182. volatile u32 canerrcnt; /* FLEXCAN 0x1C */
  183. volatile u32 canerrstat; /* FLEXCAN 0x20 */
  184. volatile u32 reserved2;
  185. volatile u32 canimask; /* FLEXCAN 0x28 */
  186. volatile u32 reserved3;
  187. volatile u32 caniflg; /* FLEXCAN 0x30 */
  188. volatile u32 reserved4[19];
  189. struct can_mb cantxfg[CAN_MB];
  190. volatile u32 reserved5[448];
  191. volatile u32 rximr[CAN_MB];
  192. };
  193. /* @clock_src:
  194. 1 = The FLEXCAN clock source is the onchip Bus Clock.
  195. 0 = The FLEXCAN clock source is the chip Oscillator Clock.*/
  196. struct can_platform_data
  197. {
  198. unsigned int clock_src; /* FLEXCAN_CLKSRC_BUS or FLEXCAN_CLKSRC_XTAL */
  199. unsigned int clock_frq; /* can ref. clock, in Hz */
  200. };
  201. /*------------------------------ 全局变量 -------------------------------------
  202. */
  203. //flexcan设备
  204. int g_can_fd = -1;
  205. static int bexit = 0;
  206. static u8 g_can_tx_call[CAN_BUS_NUM] = {0};
  207. pthread_t can_tid[CAN_BUS_NUM];
  208. pthread_t can_tid_s[CAN_BUS_NUM];
  209. unsigned g_can_mapped_size;
  210. void *g_can_map_base[CAN_BUS_NUM], *g_can_virt_addr[CAN_BUS_NUM];
  211. static struct can_dev g_can_dev[CAN_BUS_NUM] __attribute__ ((aligned(4)));
  212. FN_CAN_RECV_CALLBACK g_can_recv_callback;
  213. u8 g_app_buf_tx[CAN_PRIO_MAX][CAN_FRAME_LEN_MAX]; //应用可根据优先级申请的长帧缓冲区
  214. static pthread_mutex_t printf_mutex;
  215. extern int g_print_can;
  216. extern int g_print_can_monitor;
  217. /*------------------------------ 函数声明 -------------------------------------
  218. */
  219. static void can_soft_recv_data(int sock);
  220. static int _can_set_reset_mode(struct can_dev *dev);
  221. static int _can_set_normal_mode(struct can_dev *dev);
  222. static int _can_set_bittiming(struct can_dev *dev);
  223. static void _can_chipset_init(struct can_dev *dev, int clock_src);
  224. static void _can_app_tx(int _no);
  225. static void _can_app_rx(struct can_dev *dev, struct can_frame *frame);
  226. void _can_isr_0(void);
  227. void _can_isr_1(void);
  228. void _can_isr_err_0(void);
  229. void _can_isr_err_1(void);
  230. int _can_irq_force(int no);
  231. int _can_irq_clear(int no);
  232. int _can_irq_is_force(int no);
  233. /*------------------------------ 内部函数 -------------------------------------
  234. */
  235. static int can_soft_send(int sock, struct can_frame frame)
  236. {
  237. int nbytes;
  238. int wlen = sizeof(struct can_frame);
  239. int times = 2;
  240. while(times --)
  241. {
  242. nbytes = write(sock, &frame, wlen);
  243. if (nbytes != wlen)
  244. {
  245. // rt_printf("Send Error frame(nbytes:%d, wlen:%d)\n", nbytes, wlen);
  246. usleep(200);
  247. continue;
  248. }
  249. else
  250. {
  251. //printf("Send frame(nbytes:%d, wlen:%d)\n", nbytes, wlen);
  252. return (0);
  253. }
  254. }
  255. return -1;
  256. }
  257. static int can_send_data(can_type type, unsigned char *buf, int len)
  258. {
  259. int i, j;
  260. int cnt;
  261. int sock;
  262. int ret = 0;
  263. struct can_frame frame;
  264. if(type == CAN_1)
  265. {
  266. // DEMO
  267. sock = g_can_dev[0].can_sock;
  268. frame.can_id = 0x100;
  269. }
  270. else {
  271. // DEMO
  272. sock = g_can_dev[1].can_sock;
  273. frame.can_id = 0x101;
  274. }
  275. for(i = 0; i < len; i += 8)
  276. {
  277. cnt = len - i;
  278. if(cnt > 8)
  279. frame.can_dlc = 8;
  280. else
  281. frame.can_dlc = cnt;
  282. for(j=0; j<frame.can_dlc; j++)
  283. {
  284. frame.data[j] = buf[i+j];
  285. }
  286. if(can_soft_send(sock, frame) < 0)
  287. {
  288. ret = -1;
  289. break;
  290. }
  291. }
  292. return ret;
  293. }
  294. static void *can_proc_send(void *arg)
  295. {
  296. int sock = *(int *)arg;
  297. int index = g_can_dev[0].can_sock == sock ? 0 : 1;
  298. if (index == 0) {
  299. prctl(PR_SET_NAME, "can_send_func0");
  300. } else {
  301. prctl(PR_SET_NAME, "can_send_func1");
  302. }
  303. while(!bexit)
  304. {
  305. if(main_mod_is_exit())
  306. {
  307. break;
  308. }
  309. switch (index) {
  310. case 0:
  311. // can_send_data(CAN_1, (unsigned char *)"hello stm32", strlen("hello stm32") - 1);
  312. _can_app_tx(0);
  313. break;
  314. case 1:
  315. _can_app_tx(1);
  316. // can_send_data(CAN_2, (unsigned char *)"hello stm32", strlen("hello stm32") - 1);
  317. break;
  318. default:
  319. break;
  320. }
  321. // xenomai内核中此处usleep(10)创建第二个线程会出问题
  322. // 延时太短导致CPU占用?改为1ms就正常了需验证动作时间
  323. usleep(1000);
  324. }
  325. }
  326. static void *can_proc_recv(void *arg)
  327. {
  328. int nready;
  329. int maxfd;
  330. fd_set readfds;
  331. int sock = *(int *)arg;
  332. FD_ZERO(&readfds);
  333. FD_SET(sock, &readfds);
  334. maxfd = sock;
  335. int index = g_can_dev[0].can_sock == sock ? 0 : 1;
  336. if (index == 0) {
  337. prctl(PR_SET_NAME, "can_rev_func0");
  338. } else {
  339. prctl(PR_SET_NAME, "can_rev_func1");
  340. }
  341. while(!bexit)
  342. {
  343. if(main_mod_is_exit())
  344. {
  345. break;
  346. }
  347. nready = select(maxfd+1, &readfds, NULL, NULL, NULL);
  348. if(nready < 0)
  349. {
  350. perror("can select");
  351. break;
  352. }
  353. else if(nready == 0)
  354. {
  355. continue;
  356. }
  357. /* data is ready */
  358. if(FD_ISSET(sock, &readfds))
  359. {
  360. can_soft_recv_data(sock);
  361. }
  362. else { ; }
  363. }
  364. }
  365. static int can_open(char *can_name)
  366. {
  367. struct ifreq ifr;
  368. struct sockaddr_can addr;
  369. int sock;
  370. int ret = -1;
  371. int loopback = 0;
  372. // struct can_filter rfilter[1];
  373. /* open socket */
  374. sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  375. if(sock < 0)
  376. {
  377. return ret;
  378. }
  379. strcpy(ifr.ifr_name, can_name);
  380. if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0)
  381. {
  382. goto err_can_open;
  383. }
  384. addr.can_family = AF_CAN;
  385. addr.can_ifindex = ifr.ifr_ifindex;
  386. // fcntl(sock, F_SETFL, O_NONBLOCK);
  387. if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
  388. {
  389. goto err_can_open;
  390. }
  391. //close loopback
  392. setsockopt(sock, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback));
  393. /*
  394. rfilter[0].can_id = 0x12;
  395. rfilter[0].can_mask = CAN_SFF_MASK;
  396. setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
  397. */
  398. return sock;
  399. err_can_open:
  400. close(sock);
  401. return ret;
  402. }
  403. static int can_soft_recv(int sock, struct can_frame *frame)
  404. {
  405. int nbytes;
  406. nbytes = read(sock, frame, sizeof(struct can_frame));
  407. if(nbytes)
  408. {
  409. ;//printf("[can_recv]dlc = %d, nbytes = %d\n", frame->can_dlc, nbytes);
  410. }
  411. return nbytes;
  412. }
  413. static void can_soft_recv_data(int sock)
  414. {
  415. static unsigned char tail = 0;
  416. int i;
  417. int can_id;
  418. unsigned char can_dlc;
  419. unsigned char *data;
  420. struct can_frame frame;
  421. int index = g_can_dev[0].can_sock == sock ? 0 : 1;
  422. if(can_soft_recv(sock, &frame) < 0)
  423. return ;
  424. frame.can_id = frame.can_id&CAN_EFF_MASK;
  425. can_dlc = frame.can_dlc;
  426. data = frame.data;
  427. // printf("CAN%d dlc = %d, can_id = %x\ndata:", index,frame.can_dlc, frame.can_id);
  428. // for(i=0; i<frame.can_dlc; i++)
  429. // printf("0x%02x ", frame.data[i]);
  430. // printf("\n");
  431. _can_app_rx(&g_can_dev[index],&frame);
  432. }
  433. /*------------------------------ 外部函数 -------------------------------------
  434. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  435. */
  436. int can_init(void)
  437. {
  438. struct can_dev *dev;
  439. int i;
  440. off_t target;
  441. unsigned page_size, offset_in_page;
  442. unsigned width = 8 * sizeof(int);
  443. g_can_mapped_size = page_size = sysconf(_SC_PAGESIZE);
  444. offset_in_page = (unsigned)target & (page_size - 1);
  445. if (offset_in_page + width > page_size) {
  446. /* This access spans pages.
  447. * Must map two pages to make it possible: */
  448. g_can_mapped_size *= 2;
  449. }
  450. g_can_fd = open("/dev/mem", O_RDWR | O_SYNC);
  451. if (g_can_fd < 0)
  452. {
  453. printf("open(/dev/mem) failed.\n");
  454. return -1;
  455. }
  456. fflush(stdout);
  457. pthread_mutex_init(&printf_mutex, NULL);
  458. //初始化缓冲区
  459. memset(g_can_dev,0,sizeof(g_can_dev));
  460. for(i=0; i<CAN_BUS_NUM; i++)
  461. {
  462. dev = &g_can_dev[i];
  463. dev->no = i;
  464. target = g_rt_canfd_baseaddr[i][0];
  465. if(i==0)
  466. {
  467. /* CAN0 */
  468. g_can_map_base[i] = mmap (NULL, g_can_mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, g_can_fd, target & ~(off_t)(page_size - 1));
  469. if (g_can_map_base[i] == (void *)-1)
  470. {
  471. printf ("can[%d] dev null pointer!\n", i);
  472. }
  473. else
  474. {
  475. printf ("BSP can[%d] map Successfull!\n", i);
  476. }
  477. fflush(stdout);
  478. dev->base_addr = g_can_map_base[i];
  479. }
  480. else
  481. {
  482. /* CAN1 */
  483. g_can_map_base[i] = mmap (NULL, g_can_mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, g_can_fd, target & ~(off_t)(page_size - 1));
  484. if (g_can_map_base[i] == (void *)-1)
  485. {
  486. printf ("can[%d] dev null pointer!\n", i);
  487. }
  488. else
  489. {
  490. printf ("BSP can[%d] map Successfull!\n", i);
  491. }
  492. fflush(stdout);
  493. dev->base_addr = g_can_map_base[i];
  494. }
  495. /* set chip into reset mode */
  496. _can_set_reset_mode(dev);
  497. _can_set_bittiming(dev);
  498. // 申请实时中断
  499. if(i == 0)
  500. {
  501. rt_request_irq(CFG_CAN_VECTOR_BEGIN + 0,CFG_INT_LEVEL_CAN,_can_isr_0,"can_isr_0");
  502. rt_request_irq(CFG_CAN_VECTOR_BEGIN + 1,CFG_INT_LEVEL_CAN,_can_isr_err_0,"can_isr_err_00");
  503. rt_request_irq(CFG_CAN_VECTOR_BEGIN + 3,CFG_INT_LEVEL_CAN,_can_isr_err_0,"can_isr_err_01");
  504. }
  505. else
  506. {
  507. rt_request_irq(CFG_CAN_VECTOR_BEGIN + 4,CFG_INT_LEVEL_CAN,_can_isr_1,"can_isr_1");
  508. rt_request_irq(CFG_CAN_VECTOR_BEGIN + 5,CFG_INT_LEVEL_CAN,_can_isr_err_1,"can_isr_err_10");
  509. rt_request_irq(CFG_CAN_VECTOR_BEGIN + 7,CFG_INT_LEVEL_CAN,_can_isr_err_1,"can_isr_err_11");
  510. }
  511. // 获取CAN设备句柄
  512. if (i == 0) {
  513. g_can_dev[i].can_sock = can_open("can0");
  514. } else {
  515. g_can_dev[i].can_sock = can_open("can1");
  516. }
  517. // 创建CAN设备接收线程
  518. if (0 != pthread_create(&can_tid[i], NULL, can_proc_recv, (void *)&g_can_dev[i].can_sock))
  519. {
  520. return -2;
  521. }
  522. // 创建CAN设备发送线程
  523. if (0 != pthread_create(&can_tid_s[i], NULL, can_proc_send, (void *)&g_can_dev[i].can_sock))
  524. {
  525. return -3;
  526. }
  527. /* init and start flexcan */
  528. _can_chipset_init(dev, 0);
  529. _can_set_normal_mode(dev);
  530. }
  531. return 0;
  532. }
  533. int can_exit(void)
  534. {
  535. int i = 0;
  536. // exit can recv thread
  537. bexit = 1;
  538. for (i = 0; i < CAN_BUS_NUM; i++) {
  539. pthread_join(can_tid[i], NULL);
  540. pthread_join(can_tid_s[i], NULL);
  541. if (g_can_map_base[i]) {
  542. if (munmap(g_can_map_base, g_can_mapped_size) == -1) {
  543. printf("can[%d] dev munmap failed!", i);
  544. return -1;
  545. }
  546. }
  547. if (g_can_dev[i].can_sock >= 0) {
  548. close(g_can_dev[i].can_sock);
  549. }
  550. }
  551. if (g_can_fd >= 0)
  552. {
  553. close(g_can_fd);
  554. g_can_fd = -1;
  555. }
  556. rt_free_irq(CFG_CAN_VECTOR_BEGIN + 0);
  557. rt_free_irq(CFG_CAN_VECTOR_BEGIN + 1);
  558. rt_free_irq(CFG_CAN_VECTOR_BEGIN + 3);
  559. rt_free_irq(CFG_CAN_VECTOR_BEGIN + 4);
  560. rt_free_irq(CFG_CAN_VECTOR_BEGIN + 5);
  561. rt_free_irq(CFG_CAN_VECTOR_BEGIN + 7);
  562. pthread_mutex_destroy(&printf_mutex);
  563. return 0;
  564. }
  565. int can_regester_recv_callback(FN_CAN_RECV_CALLBACK fn)
  566. {
  567. g_can_recv_callback = fn;
  568. return 0;
  569. }
  570. u8 * can_request_tx_buf(u8 type)
  571. {
  572. int prior;
  573. //提取优先级
  574. prior=(type >> 6 ) & CAN_FRAME_MASK_PRIOR;
  575. return g_app_buf_tx[prior];
  576. }
  577. int can_send(u32 no,u8 *buf)
  578. {
  579. struct can_dev *dev;
  580. struct can_mb *pfm;
  581. int i,sf_num,sf_len ;
  582. int frame_mark; // 帧标识
  583. unsigned char prior; //应用优先级
  584. unsigned char *p;
  585. u32 len;
  586. // 检查参数
  587. if(no >= CAN_BUS_NUM)
  588. {
  589. return -1;
  590. }
  591. if(buf == NULL)
  592. {
  593. return -2;
  594. }
  595. // 检查地址
  596. if(buf[1]>= CAN_BUS_ADDR_NUM || buf[2] >= CAN_BUS_ADDR_NUM)
  597. {
  598. return -5;
  599. }
  600. // 检查长度
  601. len = buf[3];
  602. if(len > CAN_LONGFRAME_DATA_LEN)
  603. {
  604. return -6;
  605. }
  606. dev = &g_can_dev[no];
  607. //提取优先级
  608. prior=(buf[0] >> 6 ) & CAN_FRAME_MASK_PRIOR;
  609. // 将长帧转换为短帧
  610. //计算需要分为多少帧短帧
  611. sf_num=(len + CAN_FRAME_DATA_LEN - 1)/CAN_FRAME_DATA_LEN;
  612. if(sf_num == 0)
  613. {
  614. sf_num = 1;
  615. }
  616. //空间够吗?
  617. if(CAN_BUF_SPACE(&dev->tx_buf[prior], CAN_FRAME_NUM) < sf_num)
  618. {
  619. //发送溢出次数
  620. dev->stats.tx_dropped++;
  621. return -7;
  622. }
  623. // 打印报文
  624. if(g_print_can)
  625. {
  626. print_msg("TX_CAN:",buf,len+CAN_LONGFRAME_HEAD_LEN);
  627. }
  628. //帧序号递加
  629. dev->tx_buf[prior].frameno++;
  630. i=0;
  631. p= buf + CAN_LONGFRAME_HEAD_LEN;
  632. while(i<sf_num)
  633. {
  634. // 短帧数据长度
  635. sf_len = len>=CAN_FRAME_DATA_LEN?CAN_FRAME_DATA_LEN:len;
  636. // 帧标识
  637. if(sf_num == 1)
  638. {
  639. frame_mark = CAN_FRAME_SINGLE;
  640. }
  641. else
  642. {
  643. if(i == 0)
  644. {
  645. frame_mark = CAN_FRAME_BEGIN;
  646. }
  647. else if(i == (sf_num - 1))
  648. {
  649. frame_mark = CAN_FRAME_END ;
  650. }
  651. else
  652. {
  653. frame_mark = CAN_FRAME_MIDDLE;
  654. }
  655. }
  656. //指向当前头位置缓冲区
  657. pfm=(struct can_mb *)dev->tx_buf[prior].buf[dev->tx_buf[prior].head];
  658. //结构信息
  659. pfm->can_dlc=sf_len;//MB_CNT_CODE(0x08)|(1 << 21)|(1 << 22)|(sf_len << 16)
  660. // 帧ID
  661. pfm->can_id= (buf[0] << CAN_FRAME_OFFSET_TYPE)
  662. | (buf[1] << CAN_FRAME_OFFSET_DST)
  663. | (buf[2] << CAN_FRAME_OFFSET_SRC)
  664. | (frame_mark << CAN_FRAME_OFFSET_MARK)
  665. | (dev->tx_buf[prior].frameno & CAN_FRAME_MASK_SN);
  666. // 数据
  667. memcpy(pfm->data, p, sf_len);
  668. len -= sf_len; //剩余多少数据
  669. p += sf_len; //调整数据指针
  670. //头下标往后移
  671. dev->tx_buf[prior].head++;
  672. //下一短帧
  673. i++;
  674. }
  675. //统计发送长帧
  676. dev->stats.tx_longframes++;
  677. // 启动发送
  678. _can_irq_force(no);
  679. return (buf[3] + CAN_LONGFRAME_HEAD_LEN);
  680. }
  681. int can_recv(u32 no,u8 *buf,u32 len)
  682. {
  683. struct can_dev *dev;
  684. int i;
  685. int framelen;
  686. // 检查参数
  687. if(no >= CAN_BUS_NUM)
  688. {
  689. return -1;
  690. }
  691. if(buf == NULL)
  692. {
  693. return -2;
  694. }
  695. dev = &g_can_dev[no];
  696. //从0优先级开始,读取接收缓冲区的数据
  697. for(i=0;i<CAN_PRIO_MAX;i++)
  698. {
  699. //对应的长帧缓冲区没有长帧
  700. if(CAN_BUF_EMPTY(&dev->longframe_buf_rx[i]))
  701. continue;
  702. //长帧长度
  703. framelen=dev->longframe_buf_rx[i].buf[dev->longframe_buf_rx[i].tail][CAN_LONGFRAME_HEAD_LEN - 1] + CAN_LONGFRAME_HEAD_LEN;
  704. //拷贝数据到用户空间
  705. if(framelen <= len)
  706. {
  707. memcpy(buf, dev->longframe_buf_rx[i].buf[dev->longframe_buf_rx[i].tail], framelen);
  708. //调整尾位置
  709. dev->longframe_buf_rx[i].tail = (dev->longframe_buf_rx[i].tail+1) & (CAN_LONGFRAME_NUM-1);
  710. }
  711. else
  712. {
  713. rt_printf("can_recv:framelen=%d, len=%d\r\n",framelen,len);
  714. framelen=-3;
  715. }
  716. return framelen;
  717. }
  718. return 0;
  719. }
  720. int can_stat(void)
  721. {
  722. int i=0;
  723. rt_printf("flexcan communicate stat\r\n");
  724. for(i=0;i<CAN_BUS_NUM;i++)
  725. {
  726. rt_printf("flexcan%d:\r\n",i);
  727. rt_printf("tx_longframes:\t%u\r\n",g_can_dev[i].stats.tx_longframes);
  728. rt_printf("rx_longframes:\t%u\r\n",g_can_dev[i].stats.rx_longframes);
  729. rt_printf("tx_shortframes:\t%u\r\n",g_can_dev[i].stats.tx_shortframes);
  730. rt_printf("rx_shortframes:\t%u\r\n",g_can_dev[i].stats.rx_shortframes);
  731. rt_printf("tx_dropped:\t%u\r\n",g_can_dev[i].stats.tx_dropped);
  732. rt_printf("rx_dropped:\t%u\r\n",g_can_dev[i].stats.rx_dropped);
  733. rt_printf("hw_bus_errors:\t%u\r\n",g_can_dev[i].stats.hw_bus_errors);
  734. rt_printf("overrun:\t%u\r\n",g_can_dev[i].stats.overrun);
  735. }
  736. return 0;
  737. }
  738. int can_stat_reset(void)
  739. {
  740. int i=0;
  741. for(i=0;i<CAN_BUS_NUM;i++)
  742. {
  743. memset(&g_can_dev[i].stats,0,sizeof(g_can_dev[i].stats));
  744. }
  745. return 0;
  746. }
  747. /*------------------------------ 内部函数 -------------------------------------
  748. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  749. */
  750. /******************************************************************************
  751. 函数名称: _can_set_reset_mode
  752. 函数版本: 01.01
  753. 创建作者: xxxxxx
  754. 创建日期: 2010-09-25
  755. 函数说明: 复位FLEXCAN
  756. 参数说明:
  757. dev: flexcan 设备
  758. 返回值:成功返回0,失败返回1
  759. 修改记录:
  760. */
  761. static int _can_set_reset_mode(struct can_dev *dev)
  762. {
  763. // TODO: ocean
  764. return 1;
  765. }
  766. /******************************************************************************
  767. 函数名称: _can_set_normal_mode
  768. 函数版本: 01.01
  769. 创建作者: xxxxxx
  770. 创建日期: 2010-09-25
  771. 函数说明: 设置正常模式
  772. 参数说明:
  773. dev: flexcan 设备
  774. 返回值:成功返回0,失败返回1
  775. 修改记录:
  776. */
  777. static int _can_set_normal_mode(struct can_dev *dev)
  778. {
  779. // TODO: ocean
  780. return 1;
  781. }
  782. /******************************************************************************
  783. 函数名称: _can_set_bittiming
  784. 函数版本: 01.01
  785. 创建作者: xxxxxx
  786. 创建日期: 2010-09-25
  787. 函数说明: 波特率设置函数
  788. 使用外部晶振50M
  789. 配置为500K:
  790. reg = CANCTRL_PRESDIV(9) | CANCTRL_RJW(0);
  791. reg |= (CANCTRL_PROPSEG(2) |
  792. CANCTRL_PSEG1(3) |
  793. CANCTRL_PSEG2(1) |
  794. CANCTRL_SAMP(0));
  795. regs->canctrl |= reg;
  796. 配置为1M:
  797. reg = CANCTRL_PRESDIV(4) | CANCTRL_RJW(0);
  798. reg |= (CANCTRL_PROPSEG(3) |
  799. CANCTRL_PSEG1(2) |
  800. CANCTRL_PSEG2(1) |
  801. CANCTRL_SAMP(0));
  802. regs->canctrl |= reg;
  803. 参数说明:
  804. dev: flexcan 设备
  805. 返回值: 返回0
  806. 修改记录:
  807. */
  808. static int _can_set_bittiming(struct can_dev *dev)
  809. {
  810. /* Clear the old bittiming */
  811. char cmd_buf[256] = {0x00};
  812. sprintf(cmd_buf, "ip link set can%d down", dev->no);
  813. system(cmd_buf);
  814. /* 设置队列宽度 */
  815. memset(cmd_buf, 0, sizeof(cmd_buf));
  816. sprintf(cmd_buf, "ip link set can%d qlen %d", dev->no, 100);
  817. system(cmd_buf);
  818. /* 配置波特率为1M */
  819. memset(cmd_buf, 0, sizeof(cmd_buf));
  820. sprintf(cmd_buf, "ip link set can%d type can bitrate %d loopback off restart-ms %d", dev->no, 1000000, 100);
  821. system(cmd_buf);
  822. /* 启动can设备 */
  823. memset(cmd_buf, 0, sizeof(cmd_buf));
  824. sprintf(cmd_buf, "ip link set can%d up", dev->no);
  825. system(cmd_buf);
  826. return 0;
  827. }
  828. /******************************************************************************
  829. 函数名称: _can_chipset_init
  830. 函数版本: 01.01
  831. 创建作者: xxxxxx
  832. 创建日期: 2010-09-25
  833. 函数说明: 初始化flexcan
  834. 参数说明:
  835. dev: flexcan 设备
  836. clock_src: 时钟源,0表示外部晶振,1表示内部总线时钟
  837. 返回值:
  838. 修改记录:
  839. */
  840. /*
  841. * initialize flexcan:
  842. * - set clock source
  843. * - set output mode
  844. * - set baudrate
  845. * - enable interrupts
  846. * - start operating mode
  847. */
  848. static void _can_chipset_init(struct can_dev *dev, int clock_src)
  849. {
  850. }
  851. static void _can_app_tx(int _no)
  852. {
  853. int sock;
  854. int i=0;
  855. struct can_mb *pfm;
  856. struct can_frame frame;
  857. struct can_dev *dev = &g_can_dev[_no];
  858. // if(g_can_tx_call[_no] == 0)
  859. // return;
  860. // g_can_tx_call[_no] = 0;
  861. for(i=0;i<CAN_PRIO_MAX;i++)
  862. {
  863. //对应优先级的缓冲区是否有数据
  864. if(CAN_BUF_EMPTY(&dev->tx_buf[i]))
  865. {
  866. continue;
  867. }
  868. //当前位置的缓冲区
  869. pfm=(struct can_mb *)dev->tx_buf[i].buf[dev->tx_buf[i].tail];
  870. frame.can_id = pfm->can_id|CAN_EFF_FLAG; // 使用扩展帧ID
  871. frame.can_dlc = pfm->can_dlc;
  872. memcpy(frame.data,pfm->data,sizeof(frame.data));
  873. sock = g_can_dev[_no].can_sock;
  874. if(can_soft_send(sock, frame) < 0)
  875. {
  876. rt_printf("%s send err!\r\n", __func__);
  877. break;
  878. }
  879. //调整尾指针
  880. dev->tx_buf[i].tail++;
  881. //统计发送短帧总数加一
  882. dev->stats.tx_shortframes++;
  883. }
  884. }
  885. /******************************************************************************
  886. 函数名称: _can_int_tx
  887. 函数版本: 01.01
  888. 创建作者: xxxxxx
  889. 创建日期: 2010-09-25
  890. 函数说明: flexcan发送处理
  891. 参数说明:
  892. dev: flexcan 设备
  893. 返回值:
  894. 修改记录:
  895. */
  896. static void _can_int_tx(struct can_dev *dev)
  897. {
  898. int i=0;
  899. struct can_mb *pfm;
  900. int txbuf = SEND_BUF;
  901. volatile struct can_regs *regs = (volatile struct can_regs *)dev->base_addr;
  902. for(i=0;i<CAN_PRIO_MAX;i++)
  903. {
  904. int j=0;
  905. unsigned int code=0;
  906. //对应优先级的缓冲区是否有数据
  907. if(CAN_BUF_EMPTY(&dev->tx_buf[i]))
  908. {
  909. continue;
  910. }
  911. //当前位置的缓冲区
  912. pfm=(struct can_mb *)dev->tx_buf[i].buf[dev->tx_buf[i].tail];
  913. //检查是否可以发送. code==8说明上一次成功发送完毕,code==0是第一次将CODE配置0了即是MB_CNT_CODE(0)
  914. code= (regs->cantxfg[txbuf].can_dlc >> 24) & 0x0F;
  915. if(!((code==8) || (code==0)))
  916. {
  917. //rt_printf("bus is busy\r\n");
  918. break;
  919. }
  920. //写数据到寄存器
  921. regs->cantxfg[txbuf].can_dlc=pfm->can_dlc;
  922. regs->cantxfg[txbuf].can_id=pfm->can_id;
  923. for(j=0;j<8;j++)
  924. {
  925. regs->cantxfg[txbuf].data[j]=pfm->data[j];
  926. }
  927. /*Control/status word to hold Tx MB active */
  928. regs->cantxfg[txbuf].can_dlc |= MB_CNT_CODE(0x0c);
  929. //调整尾指针
  930. dev->tx_buf[i].tail++;
  931. //统计发送短帧总数加一
  932. dev->stats.tx_shortframes++;
  933. break;
  934. }
  935. }
  936. /******************************************************************************
  937. 函数名称: _can_frame_short2long
  938. 函数版本: 01.01
  939. 创建作者: xxxxxx
  940. 创建日期: 2010-09-25
  941. 函数说明: 短帧组长帧
  942. 参数说明:
  943. dev: flexcan 设备
  944. prior: 优先级
  945. 返回值:
  946. 修改记录:
  947. */
  948. static int _can_frame_short2long(struct can_dev *dev, int prior)
  949. {
  950. static unsigned char pos_rec[CAN_FRAME_NUM];
  951. int pos_index;
  952. int i,len,is_deal;
  953. struct can_mb *pfm;
  954. struct can_mb *pfmtmp;
  955. unsigned char *pd,*p;
  956. unsigned char tmppos=dev->rx_buf[prior].head-1;
  957. unsigned char srcaddr;
  958. unsigned char dstaddr;
  959. unsigned char frameno;
  960. unsigned char frame_type;
  961. unsigned char frame_len;
  962. unsigned int frame_mark;
  963. unsigned char srcaddrtmp;
  964. unsigned char dstaddrtmp;
  965. unsigned char framenotmp;
  966. unsigned char frame_type_tmp;
  967. //结束帧指针
  968. pfm=(struct can_mb *)dev->rx_buf[prior].buf[tmppos];
  969. srcaddr=(pfm->can_id >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  970. dstaddr=(pfm->can_id >> CAN_FRAME_OFFSET_DST) & CAN_FRAME_MASK_DST;
  971. frameno=pfm->can_id & CAN_FRAME_MASK_SN;
  972. frame_type=(unsigned char)(pfm->can_id >> CAN_FRAME_OFFSET_TYPE) & CAN_FRAME_MASK_TYPE;
  973. frame_len = pfm->can_dlc & CAN_FRAME_MASK_LEN;//(pfm->can_dlc >> CAN_FRAME_OFFSET_LEN) & CAN_FRAME_MASK_LEN;
  974. // 查找起始帧
  975. pos_index = 0;
  976. for(i=0;i<CAN_FRAME_NUM;i++)
  977. {
  978. // 短帧
  979. pfmtmp=(struct can_mb *)dev->rx_buf[prior].buf[tmppos];
  980. frame_mark = (pfmtmp->can_id >> CAN_FRAME_OFFSET_MARK)& CAN_FRAME_MASK_MARK;
  981. srcaddrtmp = (pfmtmp->can_id >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  982. dstaddrtmp = (pfmtmp->can_id >> CAN_FRAME_OFFSET_DST) & CAN_FRAME_MASK_DST;
  983. framenotmp = pfmtmp->can_id & CAN_FRAME_MASK_SN;
  984. frame_type_tmp = (unsigned char)(pfmtmp->can_id >> CAN_FRAME_OFFSET_TYPE) & CAN_FRAME_MASK_TYPE;
  985. // 是要找的短帧
  986. if((srcaddr == srcaddrtmp ) && ( dstaddr==dstaddrtmp) && (frameno==framenotmp) && (frame_type == frame_type_tmp))
  987. {
  988. // 记录短帧位置
  989. pos_rec[pos_index++] = tmppos;
  990. // 找到起始帧
  991. if((frame_mark == CAN_FRAME_BEGIN) || (frame_mark == CAN_FRAME_SINGLE) )
  992. {
  993. break;
  994. }
  995. }
  996. // 前一短帧
  997. tmppos--;
  998. }
  999. if(pos_index == 0)
  1000. {
  1001. rt_printf("_can_frame_short2long:pos_index=%d\r\n",pos_index);
  1002. dev->stats.rx_dropped++;
  1003. return -1;
  1004. }
  1005. if(i == CAN_FRAME_NUM)
  1006. {
  1007. #if 0
  1008. rt_printf("_can_frame_short2long:i=%d,pos_index=%d.\r\n",i,pos_index);
  1009. #endif
  1010. dev->stats.rx_dropped++;
  1011. return -11;
  1012. }
  1013. // 检查长度
  1014. len = frame_len + (pos_index - 1)*CAN_FRAME_DATA_LEN;
  1015. if(len > CAN_LONGFRAME_DATA_LEN)
  1016. {
  1017. rt_printf("_can_frame_short2long:i=%d\r\n",i);
  1018. dev->stats.rx_dropped++;
  1019. return -2;
  1020. }
  1021. //长帧缓冲区首指针
  1022. pd=dev->longframe_buf_rx[prior].buf[dev->longframe_buf_rx[prior].head];
  1023. p = pd;
  1024. // 长帧头
  1025. p[0] = (pfmtmp->can_id >> CAN_FRAME_OFFSET_TYPE);
  1026. p[1] = dstaddrtmp;
  1027. p[2] = srcaddrtmp;
  1028. p[3] = len;
  1029. // 长帧数据
  1030. p += CAN_LONGFRAME_HEAD_LEN;
  1031. while(pos_index--)
  1032. {
  1033. len = pos_index == 0 ? frame_len : 8;
  1034. pfmtmp=(struct can_mb *)dev->rx_buf[prior].buf[pos_rec[pos_index]];
  1035. memcpy(p, pfmtmp->data, len);
  1036. // 置帧空标志
  1037. pfmtmp->can_dlc = 0;
  1038. p+=8;
  1039. }
  1040. // 打印报文
  1041. if(g_print_can)
  1042. {
  1043. // 增加can报文打印互斥锁,避免CAN0、CAN1两个接收线程打印混乱的情况
  1044. pthread_mutex_lock(&printf_mutex);
  1045. print_msg("RX_CAN:",pd,pd[3] + CAN_LONGFRAME_HEAD_LEN);
  1046. pthread_mutex_unlock(&printf_mutex);
  1047. }
  1048. // 回调处理此长帧
  1049. is_deal = 0;
  1050. if(g_can_recv_callback)
  1051. {
  1052. is_deal = g_can_recv_callback(dev->no,pd);
  1053. }
  1054. // 如果此长帧没有处理,调整头位置
  1055. if(is_deal != 1)
  1056. {
  1057. if(CAN_BUF_SPACE(&dev->longframe_buf_rx[prior], CAN_LONGFRAME_NUM) == 0)
  1058. {
  1059. dev->stats.rx_dropped++;
  1060. rt_printf("长帧溢出\r\n");
  1061. }
  1062. else
  1063. {
  1064. dev->longframe_buf_rx[prior].head=(dev->longframe_buf_rx[prior].head+1) & (CAN_LONGFRAME_NUM-1);
  1065. }
  1066. // 唤醒主循环处理此长帧
  1067. mainloop_wakeup();
  1068. }
  1069. return 0;
  1070. }
  1071. /******************************************************************************
  1072. 函数名称: _can_int_rx
  1073. 函数版本: 01.01
  1074. 创建作者: xxxxxx
  1075. 创建日期: 2010-09-25
  1076. 函数说明: flexcan接收中断处理
  1077. 参数说明:
  1078. dev: flexcan 设备
  1079. i: 表示第几个接收MB
  1080. 返回值:
  1081. 修改记录:
  1082. */
  1083. void _can_bus_monitor(u8 *buf)
  1084. {
  1085. static s8 str[128];
  1086. s8 *p;
  1087. int i;
  1088. sprintf(str,"CAN_RS:");
  1089. p = str + 7;
  1090. for(i=0;i<16;i++)
  1091. {
  1092. sprintf(p,"%02x ",buf[i]);
  1093. p += 3;
  1094. }
  1095. sprintf(p,"\r\n");
  1096. rt_printf(str);
  1097. }
  1098. static void _can_app_rx(struct can_dev *dev, struct can_frame *frame)
  1099. {
  1100. struct can_mb *pfm;
  1101. int ctrl = frame->can_dlc;
  1102. int canid= frame->can_id;
  1103. u32 prior=(canid >> CAN_FRAME_OFFSET_PRIOR) & 0x03;
  1104. u32 srcaddr = (canid >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  1105. int k;
  1106. // 取短帧BUF
  1107. pfm=(struct can_mb *)dev->rx_buf[prior].buf[dev->rx_buf[prior].head];
  1108. if(pfm->can_dlc)
  1109. {
  1110. #if 0
  1111. print_mem("CAN_BUF_FULL: ",(u8*)pfm,16);
  1112. #endif
  1113. dev->stats.overrun++;
  1114. }
  1115. // 得到内容
  1116. pfm->can_dlc = ctrl;
  1117. pfm->can_id = frame->can_id;
  1118. for (k = 0; k < 8; k++)
  1119. pfm->data[k] = frame->data[k];
  1120. // 如果总线监视,打印短帧
  1121. if(g_print_can_monitor)
  1122. {
  1123. _can_bus_monitor((u8*)pfm);
  1124. }
  1125. // 如果是自己发送的帧,直接返回
  1126. if(srcaddr == 0)
  1127. {
  1128. // 置帧空标志
  1129. pfm->can_dlc = 0;
  1130. return;
  1131. }
  1132. //统计接收短帧总数
  1133. dev->stats.rx_shortframes++;
  1134. //调整当前位置
  1135. dev->rx_buf[prior].head++;
  1136. //是结束帧就开始组长帧
  1137. if(((canid >> CAN_FRAME_OFFSET_MARK) & CAN_FRAME_MASK_MARK) < 0x02)
  1138. {
  1139. //统计接收长帧总数
  1140. dev->stats.rx_longframes++;
  1141. //短帧组长帧
  1142. _can_frame_short2long(dev, prior);
  1143. }
  1144. }
  1145. static void _can_int_rx(struct can_dev *dev, int i)
  1146. {
  1147. volatile struct can_regs *regs = (volatile struct can_regs *)dev->base_addr;
  1148. struct can_mb *mb = (struct can_mb *)&regs->cantxfg[i];
  1149. struct can_mb *pfm;
  1150. int ctrl = mb->can_dlc;
  1151. int canid=mb->can_id;
  1152. u32 prior=(canid >> CAN_FRAME_OFFSET_PRIOR) & 0x03;
  1153. u32 srcaddr = (canid >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  1154. int k;
  1155. // 取短帧BUF
  1156. pfm=(struct can_mb *)dev->rx_buf[prior].buf[dev->rx_buf[prior].head];
  1157. if(pfm->can_dlc)
  1158. {
  1159. #if 0
  1160. print_mem("CAN_BUF_FULL: ",(u8*)pfm,16);
  1161. #endif
  1162. dev->stats.overrun++;
  1163. }
  1164. // 得到内容
  1165. pfm->can_dlc = ctrl;
  1166. pfm->can_id = mb->can_id;
  1167. for (k = 0; k < 8; k++)
  1168. pfm->data[k] =\
  1169. regs->cantxfg[i].data[k];
  1170. // 如果总线监视,打印短帧
  1171. if(g_print_can_monitor)
  1172. {
  1173. _can_bus_monitor((u8*)pfm);
  1174. }
  1175. // 如果是自己发送的帧,直接返回
  1176. if(srcaddr == 0)
  1177. {
  1178. // 置帧空标志
  1179. pfm->can_dlc = 0;
  1180. return;
  1181. }
  1182. //统计接收短帧总数
  1183. dev->stats.rx_shortframes++;
  1184. //调整当前位置
  1185. dev->rx_buf[prior].head++;
  1186. //是结束帧就开始组长帧
  1187. if(((canid >> CAN_FRAME_OFFSET_MARK) & CAN_FRAME_MASK_MARK) < 0x02)
  1188. {
  1189. //统计接收长帧总数
  1190. dev->stats.rx_longframes++;
  1191. //短帧组长帧
  1192. _can_frame_short2long(dev, prior);
  1193. }
  1194. }
  1195. void _can_isr(int no)
  1196. {
  1197. struct can_dev *dev = &g_can_dev[no];
  1198. volatile struct can_regs *regs = (volatile struct can_regs *)dev->base_addr;
  1199. u32 oflags;
  1200. // 得到中断标志
  1201. oflags = regs->caniflg;
  1202. // 处理发送软中断
  1203. if(_can_irq_is_force(no))
  1204. {
  1205. // 应用程序启动发送
  1206. oflags |= SEND_BUF_BIT;
  1207. _can_irq_clear(no);
  1208. }
  1209. // 检查发送标志
  1210. if(oflags & SEND_BUF_BIT)
  1211. {
  1212. // 清发送中断
  1213. regs->caniflg = SEND_BUF_BIT;
  1214. oflags &= (~SEND_BUF_BIT);
  1215. // 发送一帧
  1216. _can_int_tx(dev);
  1217. }
  1218. // 处理接收中断
  1219. // 硬件overrun
  1220. if(oflags & 0x80)
  1221. {
  1222. dev->stats.overrun++;
  1223. }
  1224. // 接收一帧
  1225. if(oflags & 0x20)
  1226. {
  1227. _can_int_rx(dev,0);
  1228. }
  1229. // 清接收中断标志
  1230. regs->caniflg = oflags;
  1231. return ;
  1232. }
  1233. void _can_isr_err(int no)
  1234. {
  1235. struct can_dev *dev = &g_can_dev[no];
  1236. volatile struct can_regs *regs = (struct can_regs *)dev->base_addr;
  1237. u32 errstate = regs->canerrstat;
  1238. regs->canerrstat = errstate;
  1239. dev->stats.hw_bus_errors++;//统计出错信息
  1240. return ;
  1241. }
  1242. void _can_isr_0(void)
  1243. {
  1244. _can_isr(0);
  1245. }
  1246. void _can_isr_1(void)
  1247. {
  1248. _can_isr(1);
  1249. }
  1250. void _can_isr_err_0(void)
  1251. {
  1252. _can_isr_err(0);
  1253. }
  1254. void _can_isr_err_1(void)
  1255. {
  1256. _can_isr_err(1);
  1257. }
  1258. int _can_irq_force(int no)
  1259. {
  1260. #ifdef __KERNEL__
  1261. uint32_t flags;
  1262. no *= 4;
  1263. rt_irq_save(flags);
  1264. REG_MCF_INTFRCL1 |= 1 << no;
  1265. rt_irq_restore(flags);
  1266. #else
  1267. g_can_tx_call[no] = 1;
  1268. #endif
  1269. return 0;
  1270. }
  1271. int _can_irq_clear(int no)
  1272. {
  1273. uint32_t flags;
  1274. no *= 4;
  1275. rt_irq_save(flags);
  1276. REG_MCF_INTFRCL1 &= ~(1 << no);
  1277. rt_irq_restore(flags);
  1278. return 0;
  1279. }
  1280. int _can_irq_is_force(int no)
  1281. {
  1282. no *= 4;
  1283. if(REG_MCF_INTFRCL1 & (1 << no))
  1284. {
  1285. return 1;
  1286. }
  1287. else
  1288. {
  1289. return 0;
  1290. }
  1291. }
  1292. /*------------------------------ 测试函数 -------------------------------------
  1293. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  1294. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  1295. */
  1296. #define LOOP_BEGIN 1
  1297. int can_test(void)
  1298. {
  1299. static unsigned char buf_tx[CAN_LONGFRAME_LEN],buf_rx[CAN_LONGFRAME_LEN];
  1300. static unsigned char loop = LOOP_BEGIN;
  1301. static uint32_t us0 = 0,err_count=0;
  1302. uint32_t us1;
  1303. int i;
  1304. int len_tx,len_rx;
  1305. // 1S调用一次
  1306. us1 = ustimer_get_origin();
  1307. if(us1 - us0 < USTIMER_SEC*10)
  1308. {
  1309. return 0;
  1310. }
  1311. us0 = us1;
  1312. // 发送一帧
  1313. memset(buf_tx,0,sizeof(buf_tx));
  1314. buf_tx[0] = loop;
  1315. buf_tx[1] = 1;
  1316. buf_tx[2] = 2;
  1317. buf_tx[3] = loop;
  1318. for(i=0; i<buf_tx[3]; i++)
  1319. {
  1320. buf_tx[CAN_LONGFRAME_HEAD_LEN + i] = i;
  1321. }
  1322. len_tx = can_send(0,buf_tx);
  1323. // len_tx = can_send(1,buf_tx);
  1324. // 延时5ms
  1325. ustimer_delay(USTIMER_MS*50);
  1326. // 接收一帧
  1327. memset(buf_rx,0,sizeof(buf_rx));
  1328. len_rx = can_recv(0,buf_rx,256);
  1329. if((len_tx == len_rx) && (memcmp(buf_tx,buf_rx,len_tx) == 0))
  1330. {
  1331. rt_printf("can_test ok(%03d,err_count=%d):[len_tx=%d,len_rx=%d]\r\n",loop,err_count,len_tx,len_rx);
  1332. }
  1333. else
  1334. {
  1335. err_count++;
  1336. rt_printf("can_test err(%03d,err_count=%d):[len_tx=%d,len_rx=%d]\r\n",loop,err_count,len_tx,len_rx);
  1337. // can_print_mem("TX:",buf_tx,len_tx);
  1338. // can_print_mem("RX:",buf_rx,len_rx);
  1339. }
  1340. // loop++;
  1341. if(loop > CAN_LONGFRAME_DATA_LEN)
  1342. {
  1343. loop = LOOP_BEGIN;
  1344. }
  1345. return 0;
  1346. }
  1347. #endif
  1348. /*------------------------------ 文件结束 -------------------------------------
  1349. */