Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Feb 2002 10:00:06 -0800 (PST)
From:      Julian Elischer <julian@elischer.org>
To:        Luuk van Dijk <lvd@mndmttr.nl>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: arbitrary serial speeds
Message-ID:  <Pine.BSF.4.21.0202280959180.6492-100000@InterJet.elischer.org>
In-Reply-To: <3C7E3B9B.1BACD9AC@mndmttr.nl>

next in thread | previous in thread | raw e-mail | index | archive | help
I had changes to do this 
BDE refused to commit them.


On Thu, 28 Feb 2002, Luuk van Dijk wrote:

> This is a multi-part message in MIME format.
> --------------17932B47B695003DFEDACE26
> Content-Type: text/plain; charset=us-ascii
> Content-Transfer-Encoding: 7bit
> 
> L.S.
> 
> for a project in which I communicate with embedded controllers in cars I
> need to read and write serial data at weird speeds of 5 and 10400 baud. 
> 
> the beauty of the freebsd interface to the serial ports is that the
> speed
> can be specified as an integer, i.e. not neccesarily as some predefined
> constant
> like B9600, but in src/sys/isa/sio.c the supplied value is looked up in
> a table,
> so using an arbitrary baudrate like 5 will return EINVAL.
> 
> (On linux there is an ugly way to set these weird baud rates by setting
> the
> baudrate to 38400, and using a special syscall to tell the kernel to use
> some other divisor of 115200 to generate the uart speed. needless to
> say, I prefer
> the hygiene commonly observed in bsd's api's)
> 
> an easy way would be to add my special baudrates to the table
> 'comspeedtab' 
> that maps speed to divisor, but it is even more flexible to calculate
> the divisor
> on the spot, with the same macro COMBRD() as used in the initializer of
> 'comspeedtab';
> note that this macro will automatically round to the next higher
> baudrate that is
> a divisor of 115200.
> 
> The attached patch contains the neccesary changes.  It works well for
> me,
> but who knows what I broke....
> 
> As far as I can tell, this renders the comspeedtab table, as well as the 
> routine ttspeedtab in kern/tty.c superfluous, but as I'm not sure I
> haven't
> included their removal in the patch.
> 
> Whoever maintains isa/sio.c, feel free to use this.  I'd be very happy
> if
> in future versions of FreeBSD I could use baudrates of 5 and 10400
> (actually the
> latter is rounded to 10475 == 115200/11, but that's good enough for me),
> without
> recompiling.
> 
> Regards,
> 	Luuk van Dijk
> 
> ___________________________________________________
> Mind over Matter                  lvd at mndmttr.nl
> The Netherlands                tel +31 6 224 97 227
> ___________________________________________________
> --------------17932B47B695003DFEDACE26
> Content-Type: text/plain; charset=us-ascii;
>  name="freebsd-src-sys-isa-sio-arbitrary-speed.patch"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline;
>  filename="freebsd-src-sys-isa-sio-arbitrary-speed.patch"
> 
> --- isa.org/sio.c	Wed Feb  6 23:58:00 2002
> +++ isa/sio.c	Thu Feb  7 00:08:25 2002
> @@ -2153,7 +2153,7 @@
>  		t->c_ispeed = t->c_ospeed;
>  
>  	/* check requested parameters */
> -	divisor = ttspeedtab(t->c_ospeed, comspeedtab);
> +	divisor = (t->c_ospeed) ? COMBRD(t->c_ospeed) : 0; /* was ttspeedtab(t->c_ospeed, comspeedtab); lvd */
>  	if (divisor < 0 || (divisor > 0 && t->c_ispeed != t->c_ospeed))
>  		return (EINVAL);
>  
> @@ -2794,7 +2794,7 @@
>  	 * data input register.  This also reduces the effects of the
>  	 * UMC8669F bug.
>  	 */
> -	divisor = ttspeedtab(speed, comspeedtab);
> +	divisor = (speed) ? COMBRD(speed) : 0; /* was ttspeedtab(speed, comspeedtab); lvd */
>  	dlbl = divisor & 0xFF;
>  	if (sp->dlbl != dlbl)
>  		outb(iobase + com_dlbl, dlbl);
> 
> --------------17932B47B695003DFEDACE26--
> 
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-hackers" in the body of the message
> 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0202280959180.6492-100000>