Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
serbb_posix.c File Reference
#include "ac_cfg.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <termios.h>
#include "avrdude.h"
#include "libavrdude.h"
#include "bitbang.h"
#include "serbb.h"
+ Include dependency graph for serbb_posix.c:

Go to the source code of this file.

Macros

#define DB9PINS   9
 

Functions

static int serbb_setpin (PROGRAMMER *pgm, int pinfunc, int value)
 
static int serbb_getpin (PROGRAMMER *pgm, int pinfunc)
 
static int serbb_highpulsepin (PROGRAMMER *pgm, int pinfunc)
 
static void serbb_display (PROGRAMMER *pgm, const char *p)
 
static void serbb_enable (PROGRAMMER *pgm)
 
static void serbb_disable (PROGRAMMER *pgm)
 
static void serbb_powerup (PROGRAMMER *pgm)
 
static void serbb_powerdown (PROGRAMMER *pgm)
 
static int serbb_open (PROGRAMMER *pgm, char *port)
 
static void serbb_close (PROGRAMMER *pgm)
 
void serbb_initpgm (PROGRAMMER *pgm)
 

Variables

static struct termios oldmode
 
static int serregbits [DB9PINS+1]
 
const char serbb_desc [] = "Serial port bitbanging"
 

Macro Definition Documentation

◆ DB9PINS

#define DB9PINS   9

Function Documentation

◆ serbb_close()

static void serbb_close ( PROGRAMMER pgm)
static
280{
281 if (pgm->fd.ifd != -1)
282 {
283 (void)tcsetattr(pgm->fd.ifd, TCSANOW, &oldmode);
285 close(pgm->fd.ifd);
286 }
287 return;
288}
typedef void(GLAPIENTRYP _GLUfuncptr)(void)
@ PIN_AVR_RESET
Definition libavrdude.h:355
int ifd
Definition libavrdude.h:522
static PROGRAMMER * pgm
Definition main.c:192
static struct termios oldmode
Definition serbb_posix.c:47
union filedescriptor fd
Definition libavrdude.h:637
int(* setpin)(struct programmer_t *pgm, int pinfunc, int value)
Definition libavrdude.h:678

References programmer_t::fd, filedescriptor::ifd, oldmode, pgm, PIN_AVR_RESET, programmer_t::setpin, and void().

Referenced by serbb_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ serbb_disable()

static void serbb_disable ( PROGRAMMER pgm)
static
207{
208 /* nothing */
209}

Referenced by serbb_initpgm().

+ Here is the caller graph for this function:

◆ serbb_display()

static void serbb_display ( PROGRAMMER pgm,
const char *  p 
)
static
197{
198 /* MAYBE */
199}

Referenced by serbb_initpgm().

+ Here is the caller graph for this function:

◆ serbb_enable()

static void serbb_enable ( PROGRAMMER pgm)
static
202{
203 /* nothing */
204}

Referenced by serbb_initpgm().

+ Here is the caller graph for this function:

◆ serbb_getpin()

static int serbb_getpin ( PROGRAMMER pgm,
int  pinfunc 
)
static
131{
132 unsigned int ctl;
133 unsigned char invert;
134 int r;
135 int pin = pgm->pinno[pinfunc]; // get its value
136
137 if (pin & PIN_INVERSE)
138 {
139 invert = 1;
140 pin &= PIN_MASK;
141 } else
142 invert = 0;
143
144 if ( pin < 1 || pin > DB9PINS )
145 return(-1);
146
147 switch ( pin )
148 {
149 case 2: /* rxd, currently not implemented, FIXME */
150 return(-1);
151
152 case 1: /* cd */
153 case 6: /* dsr */
154 case 8: /* cts */
155 case 9: /* ri */
156 r = ioctl(pgm->fd.ifd, TIOCMGET, &ctl);
157 if (r < 0) {
158 perror("ioctl(\"TIOCMGET\")");
159 return -1;
160 }
161 if ( !invert )
162 {
163#ifdef DEBUG
164 printf("%s is %d\n",serpins[pin],(ctl & serregbits[pin]) ? 1 : 0 );
165#endif
166 return ( (ctl & serregbits[pin]) ? 1 : 0 );
167 }
168 else
169 {
170#ifdef DEBUG
171 printf("%s is %d (~)\n",serpins[pin],(ctl & serregbits[pin]) ? 0 : 1 );
172#endif
173 return (( ctl & serregbits[pin]) ? 0 : 1 );
174 }
175
176 default: /* impossible */
177 return(-1);
178 }
179}
#define PIN_MASK
Definition libavrdude.h:366
#define PIN_INVERSE
Definition libavrdude.h:367
static int serregbits[DB9PINS+1]
Definition serbb_posix.c:65
#define DB9PINS
Definition serbb_posix.c:63
unsigned int pinno[N_PINS]
Definition libavrdude.h:622

References DB9PINS, programmer_t::fd, filedescriptor::ifd, pgm, PIN_INVERSE, PIN_MASK, programmer_t::pinno, and serregbits.

Referenced by serbb_initpgm().

+ Here is the caller graph for this function:

◆ serbb_highpulsepin()

static int serbb_highpulsepin ( PROGRAMMER pgm,
int  pinfunc 
)
static
182{
183 int pin = pgm->pinno[pinfunc]; // replace pin name by its value
184
185 if ( (pin & PIN_MASK) < 1 || (pin & PIN_MASK) > DB9PINS )
186 return -1;
187
188 serbb_setpin(pgm, pinfunc, 1);
189 serbb_setpin(pgm, pinfunc, 0);
190
191 return 0;
192}
static int serbb_setpin(PROGRAMMER *pgm, int pinfunc, int value)
Definition serbb_posix.c:73

References DB9PINS, pgm, PIN_MASK, programmer_t::pinno, and serbb_setpin().

Referenced by serbb_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ serbb_initpgm()

void serbb_initpgm ( PROGRAMMER pgm)
293{
294 strcpy(pgm->type, "SERBB");
295
296 pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
297
319}
int avr_write_byte_default(PROGRAMMER *pgm, AVRPART *p, AVRMEM *mem, unsigned long addr, unsigned char data)
Definition avr.c:530
int avr_read_byte_default(PROGRAMMER *pgm, AVRPART *p, AVRMEM *mem, unsigned long addr, unsigned char *value)
Definition avr.c:183
int bitbang_initialize(PROGRAMMER *pgm, AVRPART *p)
Definition bitbang.c:523
int bitbang_pgm_led(PROGRAMMER *pgm, int value)
Definition bitbang.c:308
int bitbang_program_enable(PROGRAMMER *pgm, AVRPART *p)
Definition bitbang.c:486
int bitbang_chip_erase(PROGRAMMER *pgm, AVRPART *p)
Definition bitbang.c:425
int bitbang_err_led(PROGRAMMER *pgm, int value)
Definition bitbang.c:302
int bitbang_cmd_tpi(PROGRAMMER *pgm, const unsigned char *cmd, int cmd_len, unsigned char *res, int res_len)
Definition bitbang.c:350
int bitbang_rdy_led(PROGRAMMER *pgm, int value)
Definition bitbang.c:296
int bitbang_vfy_led(PROGRAMMER *pgm, int value)
Definition bitbang.c:314
int bitbang_cmd(PROGRAMMER *pgm, const unsigned char *cmd, unsigned char *res)
Definition bitbang.c:325
int pgm_fill_old_pins(struct programmer_t *const pgm)
Definition pindefs.c:120
static void serbb_disable(PROGRAMMER *pgm)
Definition serbb_posix.c:206
static int serbb_highpulsepin(PROGRAMMER *pgm, int pinfunc)
Definition serbb_posix.c:181
static void serbb_close(PROGRAMMER *pgm)
Definition serbb_posix.c:279
static void serbb_display(PROGRAMMER *pgm, const char *p)
Definition serbb_posix.c:196
static int serbb_open(PROGRAMMER *pgm, char *port)
Definition serbb_posix.c:221
static void serbb_powerdown(PROGRAMMER *pgm)
Definition serbb_posix.c:216
static void serbb_powerup(PROGRAMMER *pgm)
Definition serbb_posix.c:211
static void serbb_enable(PROGRAMMER *pgm)
Definition serbb_posix.c:201
static int serbb_getpin(PROGRAMMER *pgm, int pinfunc)
Definition serbb_posix.c:130
void(* display)(struct programmer_t *pgm, const char *p)
Definition libavrdude.h:644
int(* open)(struct programmer_t *pgm, char *port)
Definition libavrdude.h:657
int(* read_byte)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned long addr, unsigned char *value)
Definition libavrdude.h:670
void(* powerup)(struct programmer_t *pgm)
Definition libavrdude.h:647
int(* getpin)(struct programmer_t *pgm, int pinfunc)
Definition libavrdude.h:679
int(* vfy_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:642
int(* cmd_tpi)(struct programmer_t *pgm, const unsigned char *cmd, int cmd_len, unsigned char res[], int res_len)
Definition libavrdude.h:653
int(* cmd)(struct programmer_t *pgm, const unsigned char *cmd, unsigned char *res)
Definition libavrdude.h:651
int(* pgm_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:641
void(* enable)(struct programmer_t *pgm)
Definition libavrdude.h:645
int(* rdy_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:639
int(* err_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:640
int(* highpulsepin)(struct programmer_t *pgm, int pinfunc)
Definition libavrdude.h:680
int(* program_enable)(struct programmer_t *pgm, AVRPART *p)
Definition libavrdude.h:649
int(* write_byte)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned long addr, unsigned char value)
Definition libavrdude.h:668
char type[PGM_TYPELEN]
Definition libavrdude.h:619
int(* initialize)(struct programmer_t *pgm, AVRPART *p)
Definition libavrdude.h:643
void(* close)(struct programmer_t *pgm)
Definition libavrdude.h:658
int(* chip_erase)(struct programmer_t *pgm, AVRPART *p)
Definition libavrdude.h:650
void(* disable)(struct programmer_t *pgm)
Definition libavrdude.h:646
void(* powerdown)(struct programmer_t *pgm)
Definition libavrdude.h:648

References avr_read_byte_default(), avr_write_byte_default(), bitbang_chip_erase(), bitbang_cmd(), bitbang_cmd_tpi(), bitbang_err_led(), bitbang_initialize(), bitbang_pgm_led(), bitbang_program_enable(), bitbang_rdy_led(), bitbang_vfy_led(), programmer_t::chip_erase, programmer_t::close, programmer_t::cmd, programmer_t::cmd_tpi, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::err_led, programmer_t::getpin, programmer_t::highpulsepin, programmer_t::initialize, programmer_t::open, pgm, pgm_fill_old_pins(), programmer_t::pgm_led, programmer_t::powerdown, programmer_t::powerup, programmer_t::program_enable, programmer_t::rdy_led, programmer_t::read_byte, serbb_close(), serbb_disable(), serbb_display(), serbb_enable(), serbb_getpin(), serbb_highpulsepin(), serbb_open(), serbb_powerdown(), serbb_powerup(), serbb_setpin(), programmer_t::setpin, programmer_t::type, programmer_t::vfy_led, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ serbb_open()

static int serbb_open ( PROGRAMMER pgm,
char *  port 
)
static
222{
223 struct termios mode;
224 int flags;
225 int r;
226
228 return -1;
229
230 /* adapted from uisp code */
231
232 pgm->fd.ifd = open(port, O_RDWR | O_NOCTTY | O_NONBLOCK);
233
234 if (pgm->fd.ifd < 0) {
235 perror(port);
236 return(-1);
237 }
238
239 r = tcgetattr(pgm->fd.ifd, &mode);
240 if (r < 0) {
241 avrdude_message(MSG_INFO, "%s: ", port);
242 perror("tcgetattr");
243 return(-1);
244 }
245 oldmode = mode;
246
247 mode.c_iflag = IGNBRK | IGNPAR;
248 mode.c_oflag = 0;
249 mode.c_cflag = CLOCAL | CREAD | CS8 | B9600;
250 mode.c_cc [VMIN] = 1;
251 mode.c_cc [VTIME] = 0;
252
253 r = tcsetattr(pgm->fd.ifd, TCSANOW, &mode);
254 if (r < 0) {
255 avrdude_message(MSG_INFO, "%s: ", port);
256 perror("tcsetattr");
257 return(-1);
258 }
259
260 /* Clear O_NONBLOCK flag. */
261 flags = fcntl(pgm->fd.ifd, F_GETFL, 0);
262 if (flags == -1)
263 {
264 avrdude_message(MSG_INFO, "%s: Can not get flags: %s\n",
265 progname, strerror(errno));
266 return(-1);
267 }
268 flags &= ~O_NONBLOCK;
269 if (fcntl(pgm->fd.ifd, F_SETFL, flags) == -1)
270 {
271 avrdude_message(MSG_INFO, "%s: Can not clear nonblock flag: %s\n",
272 progname, strerror(errno));
273 return(-1);
274 }
275
276 return(0);
277}
#define MSG_INFO
Definition avrdude.h:51
char * progname
Definition main.c:61
int avrdude_message(const int msglvl, const char *format,...)
Definition main.c:93
int bitbang_check_prerequisites(PROGRAMMER *pgm)
Definition bitbang.c:637
IGL_INLINE void mode(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &X, const int d, Eigen::Matrix< T, Eigen::Dynamic, 1 > &M)
Definition mode.cpp:14

References avrdude_message(), bitbang_check_prerequisites(), programmer_t::fd, filedescriptor::ifd, MSG_INFO, oldmode, pgm, and progname.

Referenced by serbb_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ serbb_powerdown()

static void serbb_powerdown ( PROGRAMMER pgm)
static
217{
218 /* nothing */
219}

Referenced by serbb_initpgm().

+ Here is the caller graph for this function:

◆ serbb_powerup()

static void serbb_powerup ( PROGRAMMER pgm)
static
212{
213 /* nothing */
214}

Referenced by serbb_initpgm().

+ Here is the caller graph for this function:

◆ serbb_setpin()

static int serbb_setpin ( PROGRAMMER pgm,
int  pinfunc,
int  value 
)
static
74{
75 unsigned int ctl;
76 int r;
77 int pin = pgm->pinno[pinfunc]; // get its value
78
79 if (pin & PIN_INVERSE)
80 {
81 value = !value;
82 pin &= PIN_MASK;
83 }
84
85 if ( pin < 1 || pin > DB9PINS )
86 return -1;
87
88#ifdef DEBUG
89 printf("%s to %d\n",serpins[pin],value);
90#endif
91
92 switch ( pin )
93 {
94 case 3: /* txd */
95 r = ioctl(pgm->fd.ifd, value ? TIOCSBRK : TIOCCBRK, 0);
96 if (r < 0) {
97 perror("ioctl(\"TIOCxBRK\")");
98 return -1;
99 }
100 break;
101
102 case 4: /* dtr */
103 case 7: /* rts */
104 r = ioctl(pgm->fd.ifd, TIOCMGET, &ctl);
105 if (r < 0) {
106 perror("ioctl(\"TIOCMGET\")");
107 return -1;
108 }
109 if ( value )
110 ctl |= serregbits[pin];
111 else
112 ctl &= ~(serregbits[pin]);
113 r = ioctl(pgm->fd.ifd, TIOCMSET, &ctl);
114 if (r < 0) {
115 perror("ioctl(\"TIOCMSET\")");
116 return -1;
117 }
118 break;
119
120 default: /* impossible */
121 return -1;
122 }
123
124 if (pgm->ispdelay > 1)
126
127 return 0;
128}
void bitbang_delay(unsigned int us)
Definition bitbang.c:135
int ispdelay
Definition libavrdude.h:636

References bitbang_delay(), DB9PINS, programmer_t::fd, filedescriptor::ifd, programmer_t::ispdelay, pgm, PIN_INVERSE, PIN_MASK, programmer_t::pinno, and serregbits.

Referenced by serbb_highpulsepin(), and serbb_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ oldmode

struct termios oldmode
static

Referenced by serbb_close(), and serbb_open().

◆ serbb_desc

const char serbb_desc[] = "Serial port bitbanging"

◆ serregbits

int serregbits[DB9PINS+1]
static
Initial value:
=
{ 0, TIOCM_CD, 0, 0, TIOCM_DTR, 0, TIOCM_DSR, TIOCM_RTS, TIOCM_CTS, TIOCM_RI }

Referenced by serbb_getpin(), and serbb_setpin().