flexcan.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648
  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. return 0;
  563. }
  564. int can_regester_recv_callback(FN_CAN_RECV_CALLBACK fn)
  565. {
  566. g_can_recv_callback = fn;
  567. return 0;
  568. }
  569. u8 * can_request_tx_buf(u8 type)
  570. {
  571. int prior;
  572. //提取优先级
  573. prior=(type >> 6 ) & CAN_FRAME_MASK_PRIOR;
  574. return g_app_buf_tx[prior];
  575. }
  576. int can_send(u32 no,u8 *buf)
  577. {
  578. struct can_dev *dev;
  579. struct can_mb *pfm;
  580. int i,sf_num,sf_len ;
  581. int frame_mark; // 帧标识
  582. unsigned char prior; //应用优先级
  583. unsigned char *p;
  584. u32 len;
  585. // 检查参数
  586. if(no >= CAN_BUS_NUM)
  587. {
  588. return -1;
  589. }
  590. if(buf == NULL)
  591. {
  592. return -2;
  593. }
  594. // 检查地址
  595. if(buf[1]>= CAN_BUS_ADDR_NUM || buf[2] >= CAN_BUS_ADDR_NUM)
  596. {
  597. return -5;
  598. }
  599. // 检查长度
  600. len = buf[3];
  601. if(len > CAN_LONGFRAME_DATA_LEN)
  602. {
  603. return -6;
  604. }
  605. dev = &g_can_dev[no];
  606. //提取优先级
  607. prior=(buf[0] >> 6 ) & CAN_FRAME_MASK_PRIOR;
  608. // 将长帧转换为短帧
  609. //计算需要分为多少帧短帧
  610. sf_num=(len + CAN_FRAME_DATA_LEN - 1)/CAN_FRAME_DATA_LEN;
  611. if(sf_num == 0)
  612. {
  613. sf_num = 1;
  614. }
  615. //空间够吗?
  616. if(CAN_BUF_SPACE(&dev->tx_buf[prior], CAN_FRAME_NUM) < sf_num)
  617. {
  618. //发送溢出次数
  619. dev->stats.tx_dropped++;
  620. return -7;
  621. }
  622. // 打印报文
  623. if(g_print_can)
  624. {
  625. print_msg("TX_CAN:",buf,len+CAN_LONGFRAME_HEAD_LEN);
  626. }
  627. //帧序号递加
  628. dev->tx_buf[prior].frameno++;
  629. i=0;
  630. p= buf + CAN_LONGFRAME_HEAD_LEN;
  631. while(i<sf_num)
  632. {
  633. // 短帧数据长度
  634. sf_len = len>=CAN_FRAME_DATA_LEN?CAN_FRAME_DATA_LEN:len;
  635. // 帧标识
  636. if(sf_num == 1)
  637. {
  638. frame_mark = CAN_FRAME_SINGLE;
  639. }
  640. else
  641. {
  642. if(i == 0)
  643. {
  644. frame_mark = CAN_FRAME_BEGIN;
  645. }
  646. else if(i == (sf_num - 1))
  647. {
  648. frame_mark = CAN_FRAME_END ;
  649. }
  650. else
  651. {
  652. frame_mark = CAN_FRAME_MIDDLE;
  653. }
  654. }
  655. //指向当前头位置缓冲区
  656. pfm=(struct can_mb *)dev->tx_buf[prior].buf[dev->tx_buf[prior].head];
  657. //结构信息
  658. pfm->can_dlc=sf_len;//MB_CNT_CODE(0x08)|(1 << 21)|(1 << 22)|(sf_len << 16)
  659. // 帧ID
  660. pfm->can_id= (buf[0] << CAN_FRAME_OFFSET_TYPE)
  661. | (buf[1] << CAN_FRAME_OFFSET_DST)
  662. | (buf[2] << CAN_FRAME_OFFSET_SRC)
  663. | (frame_mark << CAN_FRAME_OFFSET_MARK)
  664. | (dev->tx_buf[prior].frameno & CAN_FRAME_MASK_SN);
  665. // 数据
  666. memcpy(pfm->data, p, sf_len);
  667. len -= sf_len; //剩余多少数据
  668. p += sf_len; //调整数据指针
  669. //头下标往后移
  670. dev->tx_buf[prior].head++;
  671. //下一短帧
  672. i++;
  673. }
  674. //统计发送长帧
  675. dev->stats.tx_longframes++;
  676. // 启动发送
  677. _can_irq_force(no);
  678. return (buf[3] + CAN_LONGFRAME_HEAD_LEN);
  679. }
  680. int can_recv(u32 no,u8 *buf,u32 len)
  681. {
  682. struct can_dev *dev;
  683. int i;
  684. int framelen;
  685. // 检查参数
  686. if(no >= CAN_BUS_NUM)
  687. {
  688. return -1;
  689. }
  690. if(buf == NULL)
  691. {
  692. return -2;
  693. }
  694. dev = &g_can_dev[no];
  695. //从0优先级开始,读取接收缓冲区的数据
  696. for(i=0;i<CAN_PRIO_MAX;i++)
  697. {
  698. //对应的长帧缓冲区没有长帧
  699. if(CAN_BUF_EMPTY(&dev->longframe_buf_rx[i]))
  700. continue;
  701. //长帧长度
  702. framelen=dev->longframe_buf_rx[i].buf[dev->longframe_buf_rx[i].tail][CAN_LONGFRAME_HEAD_LEN - 1] + CAN_LONGFRAME_HEAD_LEN;
  703. //拷贝数据到用户空间
  704. if(framelen <= len)
  705. {
  706. memcpy(buf, dev->longframe_buf_rx[i].buf[dev->longframe_buf_rx[i].tail], framelen);
  707. //调整尾位置
  708. dev->longframe_buf_rx[i].tail = (dev->longframe_buf_rx[i].tail+1) & (CAN_LONGFRAME_NUM-1);
  709. }
  710. else
  711. {
  712. rt_printf("can_recv:framelen=%d, len=%d\r\n",framelen,len);
  713. framelen=-3;
  714. }
  715. return framelen;
  716. }
  717. return 0;
  718. }
  719. int can_stat(void)
  720. {
  721. int i=0;
  722. rt_printf("flexcan communicate stat\r\n");
  723. for(i=0;i<CAN_BUS_NUM;i++)
  724. {
  725. rt_printf("flexcan%d:\r\n",i);
  726. rt_printf("tx_longframes:\t%u\r\n",g_can_dev[i].stats.tx_longframes);
  727. rt_printf("rx_longframes:\t%u\r\n",g_can_dev[i].stats.rx_longframes);
  728. rt_printf("tx_shortframes:\t%u\r\n",g_can_dev[i].stats.tx_shortframes);
  729. rt_printf("rx_shortframes:\t%u\r\n",g_can_dev[i].stats.rx_shortframes);
  730. rt_printf("tx_dropped:\t%u\r\n",g_can_dev[i].stats.tx_dropped);
  731. rt_printf("rx_dropped:\t%u\r\n",g_can_dev[i].stats.rx_dropped);
  732. rt_printf("hw_bus_errors:\t%u\r\n",g_can_dev[i].stats.hw_bus_errors);
  733. rt_printf("overrun:\t%u\r\n",g_can_dev[i].stats.overrun);
  734. }
  735. return 0;
  736. }
  737. int can_stat_reset(void)
  738. {
  739. int i=0;
  740. for(i=0;i<CAN_BUS_NUM;i++)
  741. {
  742. memset(&g_can_dev[i].stats,0,sizeof(g_can_dev[i].stats));
  743. }
  744. return 0;
  745. }
  746. /*------------------------------ 内部函数 -------------------------------------
  747. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  748. */
  749. /******************************************************************************
  750. 函数名称: _can_set_reset_mode
  751. 函数版本: 01.01
  752. 创建作者: xxxxxx
  753. 创建日期: 2010-09-25
  754. 函数说明: 复位FLEXCAN
  755. 参数说明:
  756. dev: flexcan 设备
  757. 返回值:成功返回0,失败返回1
  758. 修改记录:
  759. */
  760. static int _can_set_reset_mode(struct can_dev *dev)
  761. {
  762. // TODO: ocean
  763. return 1;
  764. }
  765. /******************************************************************************
  766. 函数名称: _can_set_normal_mode
  767. 函数版本: 01.01
  768. 创建作者: xxxxxx
  769. 创建日期: 2010-09-25
  770. 函数说明: 设置正常模式
  771. 参数说明:
  772. dev: flexcan 设备
  773. 返回值:成功返回0,失败返回1
  774. 修改记录:
  775. */
  776. static int _can_set_normal_mode(struct can_dev *dev)
  777. {
  778. // TODO: ocean
  779. return 1;
  780. }
  781. /******************************************************************************
  782. 函数名称: _can_set_bittiming
  783. 函数版本: 01.01
  784. 创建作者: xxxxxx
  785. 创建日期: 2010-09-25
  786. 函数说明: 波特率设置函数
  787. 使用外部晶振50M
  788. 配置为500K:
  789. reg = CANCTRL_PRESDIV(9) | CANCTRL_RJW(0);
  790. reg |= (CANCTRL_PROPSEG(2) |
  791. CANCTRL_PSEG1(3) |
  792. CANCTRL_PSEG2(1) |
  793. CANCTRL_SAMP(0));
  794. regs->canctrl |= reg;
  795. 配置为1M:
  796. reg = CANCTRL_PRESDIV(4) | CANCTRL_RJW(0);
  797. reg |= (CANCTRL_PROPSEG(3) |
  798. CANCTRL_PSEG1(2) |
  799. CANCTRL_PSEG2(1) |
  800. CANCTRL_SAMP(0));
  801. regs->canctrl |= reg;
  802. 参数说明:
  803. dev: flexcan 设备
  804. 返回值: 返回0
  805. 修改记录:
  806. */
  807. static int _can_set_bittiming(struct can_dev *dev)
  808. {
  809. /* Clear the old bittiming */
  810. char cmd_buf[256] = {0x00};
  811. sprintf(cmd_buf, "ip link set can%d down", dev->no);
  812. system(cmd_buf);
  813. /* 设置队列宽度 */
  814. memset(cmd_buf, 0, sizeof(cmd_buf));
  815. sprintf(cmd_buf, "ip link set can%d qlen %d", dev->no, 100);
  816. system(cmd_buf);
  817. /* 配置波特率为1M */
  818. memset(cmd_buf, 0, sizeof(cmd_buf));
  819. sprintf(cmd_buf, "ip link set can%d type can bitrate %d loopback off restart-ms %d", dev->no, 1000000, 100);
  820. system(cmd_buf);
  821. /* 启动can设备 */
  822. memset(cmd_buf, 0, sizeof(cmd_buf));
  823. sprintf(cmd_buf, "ip link set can%d up", dev->no);
  824. system(cmd_buf);
  825. return 0;
  826. }
  827. /******************************************************************************
  828. 函数名称: _can_chipset_init
  829. 函数版本: 01.01
  830. 创建作者: xxxxxx
  831. 创建日期: 2010-09-25
  832. 函数说明: 初始化flexcan
  833. 参数说明:
  834. dev: flexcan 设备
  835. clock_src: 时钟源,0表示外部晶振,1表示内部总线时钟
  836. 返回值:
  837. 修改记录:
  838. */
  839. /*
  840. * initialize flexcan:
  841. * - set clock source
  842. * - set output mode
  843. * - set baudrate
  844. * - enable interrupts
  845. * - start operating mode
  846. */
  847. static void _can_chipset_init(struct can_dev *dev, int clock_src)
  848. {
  849. }
  850. static void _can_app_tx(int _no)
  851. {
  852. int sock;
  853. int i=0;
  854. struct can_mb *pfm;
  855. struct can_frame frame;
  856. struct can_dev *dev = &g_can_dev[_no];
  857. // if(g_can_tx_call[_no] == 0)
  858. // return;
  859. // g_can_tx_call[_no] = 0;
  860. for(i=0;i<CAN_PRIO_MAX;i++)
  861. {
  862. //对应优先级的缓冲区是否有数据
  863. if(CAN_BUF_EMPTY(&dev->tx_buf[i]))
  864. {
  865. continue;
  866. }
  867. //当前位置的缓冲区
  868. pfm=(struct can_mb *)dev->tx_buf[i].buf[dev->tx_buf[i].tail];
  869. frame.can_id = pfm->can_id|CAN_EFF_FLAG; // 使用扩展帧ID
  870. frame.can_dlc = pfm->can_dlc;
  871. memcpy(frame.data,pfm->data,sizeof(frame.data));
  872. sock = g_can_dev[_no].can_sock;
  873. if(can_soft_send(sock, frame) < 0)
  874. {
  875. rt_printf("%s send err!\r\n", __func__);
  876. break;
  877. }
  878. //调整尾指针
  879. dev->tx_buf[i].tail++;
  880. //统计发送短帧总数加一
  881. dev->stats.tx_shortframes++;
  882. }
  883. }
  884. /******************************************************************************
  885. 函数名称: _can_int_tx
  886. 函数版本: 01.01
  887. 创建作者: xxxxxx
  888. 创建日期: 2010-09-25
  889. 函数说明: flexcan发送处理
  890. 参数说明:
  891. dev: flexcan 设备
  892. 返回值:
  893. 修改记录:
  894. */
  895. static void _can_int_tx(struct can_dev *dev)
  896. {
  897. int i=0;
  898. struct can_mb *pfm;
  899. int txbuf = SEND_BUF;
  900. volatile struct can_regs *regs = (volatile struct can_regs *)dev->base_addr;
  901. for(i=0;i<CAN_PRIO_MAX;i++)
  902. {
  903. int j=0;
  904. unsigned int code=0;
  905. //对应优先级的缓冲区是否有数据
  906. if(CAN_BUF_EMPTY(&dev->tx_buf[i]))
  907. {
  908. continue;
  909. }
  910. //当前位置的缓冲区
  911. pfm=(struct can_mb *)dev->tx_buf[i].buf[dev->tx_buf[i].tail];
  912. //检查是否可以发送. code==8说明上一次成功发送完毕,code==0是第一次将CODE配置0了即是MB_CNT_CODE(0)
  913. code= (regs->cantxfg[txbuf].can_dlc >> 24) & 0x0F;
  914. if(!((code==8) || (code==0)))
  915. {
  916. //rt_printf("bus is busy\r\n");
  917. break;
  918. }
  919. //写数据到寄存器
  920. regs->cantxfg[txbuf].can_dlc=pfm->can_dlc;
  921. regs->cantxfg[txbuf].can_id=pfm->can_id;
  922. for(j=0;j<8;j++)
  923. {
  924. regs->cantxfg[txbuf].data[j]=pfm->data[j];
  925. }
  926. /*Control/status word to hold Tx MB active */
  927. regs->cantxfg[txbuf].can_dlc |= MB_CNT_CODE(0x0c);
  928. //调整尾指针
  929. dev->tx_buf[i].tail++;
  930. //统计发送短帧总数加一
  931. dev->stats.tx_shortframes++;
  932. break;
  933. }
  934. }
  935. /******************************************************************************
  936. 函数名称: _can_frame_short2long
  937. 函数版本: 01.01
  938. 创建作者: xxxxxx
  939. 创建日期: 2010-09-25
  940. 函数说明: 短帧组长帧
  941. 参数说明:
  942. dev: flexcan 设备
  943. prior: 优先级
  944. 返回值:
  945. 修改记录:
  946. */
  947. static int _can_frame_short2long(struct can_dev *dev, int prior)
  948. {
  949. static unsigned char pos_rec[CAN_FRAME_NUM];
  950. int pos_index;
  951. int i,len,is_deal;
  952. struct can_mb *pfm;
  953. struct can_mb *pfmtmp;
  954. unsigned char *pd,*p;
  955. unsigned char tmppos=dev->rx_buf[prior].head-1;
  956. unsigned char srcaddr;
  957. unsigned char dstaddr;
  958. unsigned char frameno;
  959. unsigned char frame_type;
  960. unsigned char frame_len;
  961. unsigned int frame_mark;
  962. unsigned char srcaddrtmp;
  963. unsigned char dstaddrtmp;
  964. unsigned char framenotmp;
  965. unsigned char frame_type_tmp;
  966. //结束帧指针
  967. pfm=(struct can_mb *)dev->rx_buf[prior].buf[tmppos];
  968. srcaddr=(pfm->can_id >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  969. dstaddr=(pfm->can_id >> CAN_FRAME_OFFSET_DST) & CAN_FRAME_MASK_DST;
  970. frameno=pfm->can_id & CAN_FRAME_MASK_SN;
  971. frame_type=(unsigned char)(pfm->can_id >> CAN_FRAME_OFFSET_TYPE) & CAN_FRAME_MASK_TYPE;
  972. frame_len = pfm->can_dlc & CAN_FRAME_MASK_LEN;//(pfm->can_dlc >> CAN_FRAME_OFFSET_LEN) & CAN_FRAME_MASK_LEN;
  973. // 查找起始帧
  974. pos_index = 0;
  975. for(i=0;i<CAN_FRAME_NUM;i++)
  976. {
  977. // 短帧
  978. pfmtmp=(struct can_mb *)dev->rx_buf[prior].buf[tmppos];
  979. frame_mark = (pfmtmp->can_id >> CAN_FRAME_OFFSET_MARK)& CAN_FRAME_MASK_MARK;
  980. srcaddrtmp = (pfmtmp->can_id >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  981. dstaddrtmp = (pfmtmp->can_id >> CAN_FRAME_OFFSET_DST) & CAN_FRAME_MASK_DST;
  982. framenotmp = pfmtmp->can_id & CAN_FRAME_MASK_SN;
  983. frame_type_tmp = (unsigned char)(pfmtmp->can_id >> CAN_FRAME_OFFSET_TYPE) & CAN_FRAME_MASK_TYPE;
  984. // 是要找的短帧
  985. if((srcaddr == srcaddrtmp ) && ( dstaddr==dstaddrtmp) && (frameno==framenotmp) && (frame_type == frame_type_tmp))
  986. {
  987. // 记录短帧位置
  988. pos_rec[pos_index++] = tmppos;
  989. // 找到起始帧
  990. if((frame_mark == CAN_FRAME_BEGIN) || (frame_mark == CAN_FRAME_SINGLE) )
  991. {
  992. break;
  993. }
  994. }
  995. // 前一短帧
  996. tmppos--;
  997. }
  998. if(pos_index == 0)
  999. {
  1000. rt_printf("_can_frame_short2long:pos_index=%d\r\n",pos_index);
  1001. dev->stats.rx_dropped++;
  1002. return -1;
  1003. }
  1004. if(i == CAN_FRAME_NUM)
  1005. {
  1006. #if 0
  1007. rt_printf("_can_frame_short2long:i=%d,pos_index=%d.\r\n",i,pos_index);
  1008. #endif
  1009. dev->stats.rx_dropped++;
  1010. return -11;
  1011. }
  1012. // 检查长度
  1013. len = frame_len + (pos_index - 1)*CAN_FRAME_DATA_LEN;
  1014. if(len > CAN_LONGFRAME_DATA_LEN)
  1015. {
  1016. rt_printf("_can_frame_short2long:i=%d\r\n",i);
  1017. dev->stats.rx_dropped++;
  1018. return -2;
  1019. }
  1020. //长帧缓冲区首指针
  1021. pd=dev->longframe_buf_rx[prior].buf[dev->longframe_buf_rx[prior].head];
  1022. p = pd;
  1023. // 长帧头
  1024. p[0] = (pfmtmp->can_id >> CAN_FRAME_OFFSET_TYPE);
  1025. p[1] = dstaddrtmp;
  1026. p[2] = srcaddrtmp;
  1027. p[3] = len;
  1028. // 长帧数据
  1029. p += CAN_LONGFRAME_HEAD_LEN;
  1030. while(pos_index--)
  1031. {
  1032. len = pos_index == 0 ? frame_len : 8;
  1033. pfmtmp=(struct can_mb *)dev->rx_buf[prior].buf[pos_rec[pos_index]];
  1034. memcpy(p, pfmtmp->data, len);
  1035. // 置帧空标志
  1036. pfmtmp->can_dlc = 0;
  1037. p+=8;
  1038. }
  1039. // 打印报文
  1040. if(g_print_can)
  1041. {
  1042. // 增加can报文打印互斥锁,避免CAN0、CAN1两个接收线程打印混乱的情况
  1043. pthread_mutex_lock(&printf_mutex);
  1044. print_msg("RX_CAN:",pd,pd[3] + CAN_LONGFRAME_HEAD_LEN);
  1045. pthread_mutex_unlock(&printf_mutex);
  1046. }
  1047. // 回调处理此长帧
  1048. is_deal = 0;
  1049. if(g_can_recv_callback)
  1050. {
  1051. is_deal = g_can_recv_callback(dev->no,pd);
  1052. }
  1053. // 如果此长帧没有处理,调整头位置
  1054. if(is_deal != 1)
  1055. {
  1056. if(CAN_BUF_SPACE(&dev->longframe_buf_rx[prior], CAN_LONGFRAME_NUM) == 0)
  1057. {
  1058. dev->stats.rx_dropped++;
  1059. rt_printf("长帧溢出\r\n");
  1060. }
  1061. else
  1062. {
  1063. dev->longframe_buf_rx[prior].head=(dev->longframe_buf_rx[prior].head+1) & (CAN_LONGFRAME_NUM-1);
  1064. }
  1065. // 唤醒主循环处理此长帧
  1066. mainloop_wakeup();
  1067. }
  1068. return 0;
  1069. }
  1070. /******************************************************************************
  1071. 函数名称: _can_int_rx
  1072. 函数版本: 01.01
  1073. 创建作者: xxxxxx
  1074. 创建日期: 2010-09-25
  1075. 函数说明: flexcan接收中断处理
  1076. 参数说明:
  1077. dev: flexcan 设备
  1078. i: 表示第几个接收MB
  1079. 返回值:
  1080. 修改记录:
  1081. */
  1082. void _can_bus_monitor(u8 *buf)
  1083. {
  1084. static s8 str[128];
  1085. s8 *p;
  1086. int i;
  1087. sprintf(str,"CAN_RS:");
  1088. p = str + 7;
  1089. for(i=0;i<16;i++)
  1090. {
  1091. sprintf(p,"%02x ",buf[i]);
  1092. p += 3;
  1093. }
  1094. sprintf(p,"\r\n");
  1095. rt_printf(str);
  1096. }
  1097. static void _can_app_rx(struct can_dev *dev, struct can_frame *frame)
  1098. {
  1099. struct can_mb *pfm;
  1100. int ctrl = frame->can_dlc;
  1101. int canid= frame->can_id;
  1102. u32 prior=(canid >> CAN_FRAME_OFFSET_PRIOR) & 0x03;
  1103. u32 srcaddr = (canid >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  1104. int k;
  1105. // 取短帧BUF
  1106. pfm=(struct can_mb *)dev->rx_buf[prior].buf[dev->rx_buf[prior].head];
  1107. if(pfm->can_dlc)
  1108. {
  1109. #if 0
  1110. print_mem("CAN_BUF_FULL: ",(u8*)pfm,16);
  1111. #endif
  1112. dev->stats.overrun++;
  1113. }
  1114. // 得到内容
  1115. pfm->can_dlc = ctrl;
  1116. pfm->can_id = frame->can_id;
  1117. for (k = 0; k < 8; k++)
  1118. pfm->data[k] = frame->data[k];
  1119. // 如果总线监视,打印短帧
  1120. if(g_print_can_monitor)
  1121. {
  1122. _can_bus_monitor((u8*)pfm);
  1123. }
  1124. // 如果是自己发送的帧,直接返回
  1125. if(srcaddr == 0)
  1126. {
  1127. // 置帧空标志
  1128. pfm->can_dlc = 0;
  1129. return;
  1130. }
  1131. //统计接收短帧总数
  1132. dev->stats.rx_shortframes++;
  1133. //调整当前位置
  1134. dev->rx_buf[prior].head++;
  1135. //是结束帧就开始组长帧
  1136. if(((canid >> CAN_FRAME_OFFSET_MARK) & CAN_FRAME_MASK_MARK) < 0x02)
  1137. {
  1138. //统计接收长帧总数
  1139. dev->stats.rx_longframes++;
  1140. //短帧组长帧
  1141. _can_frame_short2long(dev, prior);
  1142. }
  1143. }
  1144. static void _can_int_rx(struct can_dev *dev, int i)
  1145. {
  1146. volatile struct can_regs *regs = (volatile struct can_regs *)dev->base_addr;
  1147. struct can_mb *mb = (struct can_mb *)&regs->cantxfg[i];
  1148. struct can_mb *pfm;
  1149. int ctrl = mb->can_dlc;
  1150. int canid=mb->can_id;
  1151. u32 prior=(canid >> CAN_FRAME_OFFSET_PRIOR) & 0x03;
  1152. u32 srcaddr = (canid >> CAN_FRAME_OFFSET_SRC) & CAN_FRAME_MASK_SRC;
  1153. int k;
  1154. // 取短帧BUF
  1155. pfm=(struct can_mb *)dev->rx_buf[prior].buf[dev->rx_buf[prior].head];
  1156. if(pfm->can_dlc)
  1157. {
  1158. #if 0
  1159. print_mem("CAN_BUF_FULL: ",(u8*)pfm,16);
  1160. #endif
  1161. dev->stats.overrun++;
  1162. }
  1163. // 得到内容
  1164. pfm->can_dlc = ctrl;
  1165. pfm->can_id = mb->can_id;
  1166. for (k = 0; k < 8; k++)
  1167. pfm->data[k] =\
  1168. regs->cantxfg[i].data[k];
  1169. // 如果总线监视,打印短帧
  1170. if(g_print_can_monitor)
  1171. {
  1172. _can_bus_monitor((u8*)pfm);
  1173. }
  1174. // 如果是自己发送的帧,直接返回
  1175. if(srcaddr == 0)
  1176. {
  1177. // 置帧空标志
  1178. pfm->can_dlc = 0;
  1179. return;
  1180. }
  1181. //统计接收短帧总数
  1182. dev->stats.rx_shortframes++;
  1183. //调整当前位置
  1184. dev->rx_buf[prior].head++;
  1185. //是结束帧就开始组长帧
  1186. if(((canid >> CAN_FRAME_OFFSET_MARK) & CAN_FRAME_MASK_MARK) < 0x02)
  1187. {
  1188. //统计接收长帧总数
  1189. dev->stats.rx_longframes++;
  1190. //短帧组长帧
  1191. _can_frame_short2long(dev, prior);
  1192. }
  1193. }
  1194. void _can_isr(int no)
  1195. {
  1196. struct can_dev *dev = &g_can_dev[no];
  1197. volatile struct can_regs *regs = (volatile struct can_regs *)dev->base_addr;
  1198. u32 oflags;
  1199. // 得到中断标志
  1200. oflags = regs->caniflg;
  1201. // 处理发送软中断
  1202. if(_can_irq_is_force(no))
  1203. {
  1204. // 应用程序启动发送
  1205. oflags |= SEND_BUF_BIT;
  1206. _can_irq_clear(no);
  1207. }
  1208. // 检查发送标志
  1209. if(oflags & SEND_BUF_BIT)
  1210. {
  1211. // 清发送中断
  1212. regs->caniflg = SEND_BUF_BIT;
  1213. oflags &= (~SEND_BUF_BIT);
  1214. // 发送一帧
  1215. _can_int_tx(dev);
  1216. }
  1217. // 处理接收中断
  1218. // 硬件overrun
  1219. if(oflags & 0x80)
  1220. {
  1221. dev->stats.overrun++;
  1222. }
  1223. // 接收一帧
  1224. if(oflags & 0x20)
  1225. {
  1226. _can_int_rx(dev,0);
  1227. }
  1228. // 清接收中断标志
  1229. regs->caniflg = oflags;
  1230. return ;
  1231. }
  1232. void _can_isr_err(int no)
  1233. {
  1234. struct can_dev *dev = &g_can_dev[no];
  1235. volatile struct can_regs *regs = (struct can_regs *)dev->base_addr;
  1236. u32 errstate = regs->canerrstat;
  1237. regs->canerrstat = errstate;
  1238. dev->stats.hw_bus_errors++;//统计出错信息
  1239. return ;
  1240. }
  1241. void _can_isr_0(void)
  1242. {
  1243. _can_isr(0);
  1244. }
  1245. void _can_isr_1(void)
  1246. {
  1247. _can_isr(1);
  1248. }
  1249. void _can_isr_err_0(void)
  1250. {
  1251. _can_isr_err(0);
  1252. }
  1253. void _can_isr_err_1(void)
  1254. {
  1255. _can_isr_err(1);
  1256. }
  1257. int _can_irq_force(int no)
  1258. {
  1259. #ifdef __KERNEL__
  1260. uint32_t flags;
  1261. no *= 4;
  1262. rt_irq_save(flags);
  1263. REG_MCF_INTFRCL1 |= 1 << no;
  1264. rt_irq_restore(flags);
  1265. #else
  1266. g_can_tx_call[no] = 1;
  1267. #endif
  1268. return 0;
  1269. }
  1270. int _can_irq_clear(int no)
  1271. {
  1272. uint32_t flags;
  1273. no *= 4;
  1274. rt_irq_save(flags);
  1275. REG_MCF_INTFRCL1 &= ~(1 << no);
  1276. rt_irq_restore(flags);
  1277. return 0;
  1278. }
  1279. int _can_irq_is_force(int no)
  1280. {
  1281. no *= 4;
  1282. if(REG_MCF_INTFRCL1 & (1 << no))
  1283. {
  1284. return 1;
  1285. }
  1286. else
  1287. {
  1288. return 0;
  1289. }
  1290. }
  1291. /*------------------------------ 测试函数 -------------------------------------
  1292. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  1293. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  1294. */
  1295. #define LOOP_BEGIN 1
  1296. int can_test(void)
  1297. {
  1298. static unsigned char buf_tx[CAN_LONGFRAME_LEN],buf_rx[CAN_LONGFRAME_LEN];
  1299. static unsigned char loop = LOOP_BEGIN;
  1300. static uint32_t us0 = 0,err_count=0;
  1301. uint32_t us1;
  1302. int i;
  1303. int len_tx,len_rx;
  1304. // 1S调用一次
  1305. us1 = ustimer_get_origin();
  1306. if(us1 - us0 < USTIMER_SEC*10)
  1307. {
  1308. return 0;
  1309. }
  1310. us0 = us1;
  1311. // 发送一帧
  1312. memset(buf_tx,0,sizeof(buf_tx));
  1313. buf_tx[0] = loop;
  1314. buf_tx[1] = 1;
  1315. buf_tx[2] = 2;
  1316. buf_tx[3] = loop;
  1317. for(i=0; i<buf_tx[3]; i++)
  1318. {
  1319. buf_tx[CAN_LONGFRAME_HEAD_LEN + i] = i;
  1320. }
  1321. len_tx = can_send(0,buf_tx);
  1322. // len_tx = can_send(1,buf_tx);
  1323. // 延时5ms
  1324. ustimer_delay(USTIMER_MS*50);
  1325. // 接收一帧
  1326. memset(buf_rx,0,sizeof(buf_rx));
  1327. len_rx = can_recv(0,buf_rx,256);
  1328. if((len_tx == len_rx) && (memcmp(buf_tx,buf_rx,len_tx) == 0))
  1329. {
  1330. rt_printf("can_test ok(%03d,err_count=%d):[len_tx=%d,len_rx=%d]\r\n",loop,err_count,len_tx,len_rx);
  1331. }
  1332. else
  1333. {
  1334. err_count++;
  1335. rt_printf("can_test err(%03d,err_count=%d):[len_tx=%d,len_rx=%d]\r\n",loop,err_count,len_tx,len_rx);
  1336. // can_print_mem("TX:",buf_tx,len_tx);
  1337. // can_print_mem("RX:",buf_rx,len_rx);
  1338. }
  1339. // loop++;
  1340. if(loop > CAN_LONGFRAME_DATA_LEN)
  1341. {
  1342. loop = LOOP_BEGIN;
  1343. }
  1344. return 0;
  1345. }
  1346. #endif
  1347. /*------------------------------ 文件结束 -------------------------------------
  1348. */