1 /*******************************************************************
2 uLan Communication - version for generic MCS51 core based MCU
4 ul_l_c2a.c - C language bindings to low level assembly
7 Copyright holders and originators:
8 (C) 2002-2003 by Pavel Pisa pisa@cmp.felk.cvut.cz
9 (C) 2002-2003 by PiKRON Ltd. http://www.pikron.com
11 The more uLan related information can be foud at next sites
12 http://cmp.felk.cvut.cz/~pisa/ulan/
13 http://www.pikron.com/en/chromul_over.html
15 The uLan for small embedded devices can be used, modified
16 and redistributed if at least conditions of one of the
17 following licenses are met
18 - GPL - General Public License
19 - LGPL - Lesser General Public License
20 - MPL - Mozilla Public License
21 - other license conditions assigned by originators
23 If significant code contributor disagrees with some of above
24 licenses, he or she can delete such line/s, but if he deletes
25 all lines, he is not allowed redistribute code in any binary
28 *******************************************************************/
31 /*#define UL_WITH_HANDLE*/
35 /*pragma LESS_PEDANTIC*/
37 #define SDCC_PTR_DATA 0x40
38 #define SDCC_PTR_XDATA 0x00
39 #define SDCC_PTR_CODE 0x80
41 #define KEIL_PTR_DATA 0x00
42 #define KEIL_PTR_XDATA 0x01
43 #define KEIL_PTR_CODE 0x02
46 #ifndef SDCC_MODEL_LARGE
47 __data int ul_c2a_len;
48 #endif /* SDCC_MODEL_LARGE */
51 #ifndef UL_WITH_HANDLE
53 ul_msginfo __xdata msginfo;
56 ul_fd_t ul_open(const char *dev_name, const char *options)
61 int ul_close(ul_fd_t ul_fd)
67 ul_ssize_t __ul_read_avail() UL_FNC_NAKED
77 #endif /*UL_WITH_NAKED*/
82 ul_ssize_t __ul_read_avail(void) UL_FNC_NAKED
98 #ifndef SDCC_MODEL_LARGE
99 /* ul_read function for small model */
100 ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED
108 jb b.6,00001$ /*SDCC_PTR_DATA*/
114 mov dph,_ul_c2a_len+1
118 #else /*UL_WITH_NAKED*/
120 #endif /*UL_WITH_NAKED*/
136 #endif /*UL_WITH_NAKED*/
140 #else /* SDCC_MODEL_LARGE */
142 * size Allocated to stack - offset -4 (the push _bp taken into account)
143 * buffer Allocated to registers
145 ul_ssize_t __ul_read(void *buffer, ul_size_t size) __reentrant UL_FNC_NAKED
154 #else /*UL_WITH_NAKED*/
156 #endif /*UL_WITH_NAKED*/
165 jb b.6,00001$ /*SDCC_PTR_DATA*/
175 #else /*UL_WITH_NAKED*/
177 #endif /*UL_WITH_NAKED*/
193 #endif /*UL_WITH_NAKED*/
197 #endif /* SDCC_MODEL_LARGE */
201 ;ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
203 extrn code(UL_RD,UL_RDi)
206 mov dpl,r1 ; buffer address into DPTR
208 mov a,r4 ; number of bytes to write
210 xch a,r5 ; into R45 little endian
215 /* cjne A,#KEIL_PTR_XDATA,__ul_read_l1 */
216 cjne A,#01h,__ul_read_l1
217 call UL_RD ; call read => R45 number of remaining
218 sjmp __ul_read_l2 ; bytes, DPTR moved after read data
227 mov a,r6 ; compute number of read bytes => R76
233 dec r6 ; return -1 if no byte read
243 #ifndef SDCC_MODEL_LARGE
244 /* ul_write function for small model */
245 ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED
255 jnb b.6,00001$ /*SDCC_PTR_DATA*/
259 jnb b.7,00002$ /*SDCC_PTR_CODE*/
267 mov dph,_ul_c2a_len+1
270 #else /*UL_WITH_NAKED*/
272 #endif /*UL_WITH_NAKED*/
277 #endif /*UL_WITH_NAKED*/
281 #else /* SDCC_MODEL_LARGE */
283 * size Allocated to stack - offset -4 (the push _bp taken into account)
284 * buffer Allocated to registers
286 ul_ssize_t __ul_write(const void *buffer, ul_size_t size) __reentrant UL_FNC_NAKED
297 #else /*UL_WITH_NAKED*/
299 #endif /*UL_WITH_NAKED*/
308 jnb b.6,00001$ /*SDCC_PTR_DATA*/
312 jnb b.7,00002$ /*SDCC_PTR_CODE*/
323 #else /*UL_WITH_NAKED*/
325 #endif /*UL_WITH_NAKED*/
330 #endif /*UL_WITH_NAKED*/
334 #endif /* SDCC_MODEL_LARGE */
338 ;ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
340 extrn code(UL_WR,UL_WRC,UL_WRI)
343 mov dpl,r1 ; buffer address into DPTR
345 mov a,r4 ; number of bytes to write
347 xch a,r5 ; into R45 little endian
350 clr f0 ; call read => R45 number of remaining
352 /* cjne A,#KEIL_PTR_XDATA,__ul_write_l3 */
353 cjne A,#01h,__ul_write_l3
354 call UL_WR ; bytes, DPTR moved after read data
357 /* cjne A,#KEIL_PTR_CODE,__ul_write_l4 */
358 cjne A,#02h,__ul_write_l4
362 /* cjne A,#KEIL_PTR_DATA,__ul_write_l2 */
363 cjne A,#00h,__ul_write_l2
367 mov r6,#0ffh ; return -1 if there was problem
377 int __ul_newmsg(const ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED
379 /* Dadr R4, Com R5, Status R6, Stamp R7 */
383 movx a,@dptr /* dadr */
389 movx a,@dptr /* cmd */
392 movx a,@dptr /* flg */
395 movx a,@dptr /* stamp */
405 #endif /*UL_WITH_NAKED*/
410 ;int __ul_newmsg(const ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED
412 ; /* Dadr R4, Com R5, Status R6, Stamp R7 */
436 jnb f0,__ul_newmsg_l1
446 int __ul_o_close() UL_FNC_NAKED
458 #endif /*UL_WITH_NAKED*/
463 ;int __ul_o_close(void) UL_FNC_NAKED
473 jnb f0,__ul_o_close_l1
483 int __ul_i_close() UL_FNC_NAKED
495 #endif /*UL_WITH_NAKED*/
500 ;int __ul_i_close(void) UL_FNC_NAKED
510 jnb f0,___ul_i_close_l1
520 int __ul_tailmsg(const ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED
522 /* Dadr R4, Com R5, Status R6, Stamp R7 */
526 lcall ul_o_cl /* close previous output message */
527 movx a,@dptr /* dadr */
533 movx a,@dptr /* cmd */
536 movx a,@dptr /* flg */
539 movx a,@dptr /* stamp */
548 #endif /*UL_WITH_NAKED*/
553 ;int __ul_tailmsg(const ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED
559 call UL_O_CL ; close previous output message
576 jnb f0,___ul_tailmsg_l1
586 int __ul_freemsg() UL_FNC_NAKED
591 lcall ul_i_cl /* close previous input message */
593 lcall ul_o_cl /* close previous output message */
600 #endif /*UL_WITH_NAKED*/
605 ;int __ul_freemsg(void) UL_FNC_NAKED
610 call UL_I_CL ; close previous input message
612 call UL_O_CL ; close previous output message
616 jnb f0,___ul_freemsg_l1
626 int __ul_acceptmsg(ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED
628 /* Dadr R4, Com R5, Status R6, Stamp R7 */
636 movx @dptr,a /* dadr */
639 movx @dptr,a /* sadr */
642 movx @dptr,a /* cmd */
645 movx @dptr,a /* flg */
648 movx @dptr,a /* stamp */
650 lcall ul_i_l /* read length of data */
652 movx @dptr,a /* len */
659 #else /*UL_WITH_NAKED*/
661 #endif /*UL_WITH_NAKED*/
666 #endif /*UL_WITH_NAKED*/
672 ;int __ul_acceptmsg(ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED
674 ; /* Dadr R4, Com R5, Status R6, Stamp R7 */
676 public ___ul_acceptmsg
682 jb f0,___ul_acceptmsg_l1
698 lcall UL_I_L ; read length of data
700 movx @dptr,a ; len is bigendian
716 int __ul_actailmsg(ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED
721 int __ul_addfilt(const ul_msginfo UL_ARGPTRTYPE *msginfo)
738 ;int __ul_abortmsg(void)
740 public ___ul_abortmsg
742 extrn code(UL_O_ABRT)
751 uchar __ul_inepoll() UL_FNC_NAKED
762 #endif /*UL_WITH_NAKED*/
767 ;uchar __ul_inepoll(void) UL_FNC_NAKED
789 lcall ul_fnc /* Init */
809 char ul_drv_set_adr(uchar addr)
815 lcall ul_fnc /* Address */
821 ;char ul_drv_set_adr(uchar addr)
824 public _ul_drv_set_adr
835 char ul_drv_set_bdiv(uchar addr)
839 mov r0,#1 /* 2 => 19200 Bd for 11059 kHz */
840 mov a,dpl /* 5 => 19200 Bd for 18432 kHz */
841 lcall ul_fnc /* Baudrate */
847 ;char ul_drv_set_bdiv(uchar addr)
849 public _ul_drv_set_bdiv
851 mov r0,#1 ; 2 => 19200 Bd for 11059 kHz
852 mov a,r7 ; 5 => 19200 Bd for 18432 kHz
853 jmp UL_FNC ; Baudrate
859 #ifndef UL_WITHOUT_HANDLE
861 ul_ssize_t ul_read(ul_fd_t ul_fd,void *buffer, ul_size_t size)
863 return __ul_read(buffer, size);
866 ul_ssize_t ul_write(ul_fd_t ul_fd,const void *buffer, ul_size_t size)
868 return __ul_write(buffer, size);
871 int ul_newmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE *msginfo)
873 return __ul_newmsg(msginfo);
876 int ul_tailmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE *msginfo)
878 return __ul_tailmsg(msginfo);
881 int ul_freemsg(ul_fd_t ul_fd)
883 return __ul_freemsg();
886 int ul_acceptmsg(ul_fd_t ul_fd,ul_msginfo UL_ARGPTRTYPE *msginfo)
888 return __ul_acceptmsg(msginfo);
891 int ul_actailmsg(ul_fd_t ul_fd,ul_msginfo UL_ARGPTRTYPE *msginfo)
893 return __ul_actailmsg(msginfo);
896 int ul_addfilt(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE *msginfo)
898 return __ul_addfilt(msginfo);
901 int ul_abortmsg(ul_fd_t ul_fd)
903 return __ul_abortmsg();
906 uchar ul_inepoll(ul_fd_t ul_fd)
908 return __ul_inepoll();
910 #endif /*UL_WITHOUT_HANDLE*/
912 int ul_drv_debflg(ul_fd_t ul_fd,int debug_msk)
917 int ul_fd_wait(ul_fd_t ul_fd, int wait_sec)
922 int __uloi_con_ulan_set_cmd_fd(uloi_coninfo_t *coninfo, int cmd)
924 uloi_con_ulan_t *con_ulan = UL_CONTAINEROF(coninfo, uloi_con_ulan_t, con);
951 #endif /*UL_WITH_NAKED*/