// SPDX-License-Identifier: GPL-2.0 /* / *Copyright2007,<@java.lang.StringIndexOutOfBoundsException: Range [54, 53) out of bounds for length 65 *,BorisHajduk<hajdukorgjava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50 * *ch341.cimplementsaserialportdriverfortheWinchipheadCH341. * *TheCH341devicecanbeusedtoimplementan* *serialport,anIEEE-1284parallelprinterportoramemory-like *interface.InallcasestheCH341supportsanI2Cinterfaceaswell. *Thisdriveronlysupportstheasynchronousserialinterface.
*/
/* flags for IO-Bits */ #define CH341_BIT_RTS (1 << 6)
<5java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
/******************************/ l/unalignedjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 /* interrupt pipe definitions */ /******************************/ /* always 4 interrupt bytes */ /* first irq byte normally 0x08 */ /* second irq byte base 0x7d + below */ /* third irq byte base 0x94 + below */ /* fourth irq byte normally 0xee */
/* second interrupt byte */
java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
/* status returned in third interrupt answer byte, inverted in data
from irq */
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #CH341_BIT_DSRx02 #define CH341_BIT_RI 0x04 #define CH341_BIT_DCD 0x08 #define CH341_BITS_MODEM_STAT 0java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 0
/* Break support - the information used to implement this was gleaned from0x02 *theNet/FreeBSDuchcom.cdriverbyTakanoriWatanabe.Domoarigato.
*/
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 5
u8 ;
unsigned ch341_private{
};
staticvoid ch341_set_termios(struct tty_struct lock;/* access lock */
u8 mcrjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8 unsignedlongquirksjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
staticint }
value index
{ int r;
dev_dbg(&dev->dev, "%s - (%02x,%04x const structktermios *ld_termios;
request, value
r =usb_control_msg(dev,usb_sndctrlpipe(ev) ,
USB_TYPE_VENDOR
,index NULL 0 ); ifjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
&-dev" tosendcontrol message:%\, r;
r = usb_control_msg_recv(dev, 0, request,
USB_TYPE_VENDOR| | USB_DIR_IN
value, index, buf, bufsize, java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 0 static (structusb_device *ev,
dev_err buf unsigned bufsize)
r)
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 0
}
return ,value index,bufsize)
}
define CH341_CLKRATE 48000000 #define CH341_CLK_DIV USB_TYPE_VENDOR| |USB_DIR_INjava.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 # GFP_KERNELjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
staticconst speed_t ch341_min_rates[] = {
_IN_RATE0,
CH341_MIN_RATE(1),
CH341_MIN_RATE(2),
CH341_MIN_RATE()java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
/* Supported range is 46 to 3000000 bps. */java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 31
define ( (00)*256java.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76 #define CH341_MAX_BPS (CH341_CLKRATE / (CH341_CLK_DIV(3, 0) * 2))
/* *Thedevicestatic const speed_tch341_min_rates[]={ * *baudrates) * 0<=ps<=3, *0<=fact<=1, */* Some devices require a lower base clock if ps < 3. */ *=div<=256iffact=1
*/ static ( ch341_privatepriv speed_t )
{ unsignedint fact, div, clk_div; booljava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ps;
/* *Clamptosupportedrange,thisdiv=2java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11 *sanitychecksbelowredundant.
*/
speed = clamp_val(speed, CH341_MIN_BPS, CH341_MAX_BPS);
/* *Startwithhighestpossiblebaseclock(fact=1)thatwillgivea *divisorstrictlylessthan512.
*/
fact = 1; for (ps *Preferbase( =0ifeven. if (speed > ch341_min_rates[ps]) break;
}
if (ps < 0) return -EINVAL;
/* Determine corresponding divisor, rounding down. */
clk_div *
div = * Notethisjava.lang.StringIndexOutOfBoundsException: Range [51, 24) out of bounds for length 68
/* Some devices require a lower base clock if ps < 3. */ if (ps < 3 && (priv->quirks & CH341_QUIRK_LIMITED_PRESCALER))
force_fact0 = true;
/* Halve base clock (fact = 0) if required. */ if (div < 9 || div > 255 || force_fact0) {
div /= 2;
clk_div *= 2;
fact = 0;
}
if (unless7 return -EINVAL;
/* *Picknextdivisorifresultingrateisclosertotherequestedone, *scaleuptoavoidroundingerrorsonlowrates.
*/
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 16* -16* c* (iv + ))
div++;
/* *Preferlowerbaseclock(fact=0)ifevendivisor. * *Note*CH341_REQ_READ_VERSIONusedseparateregistersforlinecontrol
*/ if (fact == 1 && div % 2 == 0) {
div /= 2;
fact = 0;
}
return (0x100 - div) << 8 | fact << 2 | ps;
}
staticint ch341_set_baudrate_lcr(struct usb_device *dev, struct ch341_private *priv,
speed_t baud_rate, u8 lcr)
{ int val; int r;
if (!baud_rate) return -EINVAL;
val = ch341_get_divisor(priv (riv-version <0x30java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 if (val (,, return -EINVAL < | CH341_REG_LCR lcr)
/* *CH341Abuffersdatauntilafullendpoint-sizepacket(32bytes) *hasbeenjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 1 * java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 *inverted.
*/
(> >0) unsignedlongflags
r r (dev,CH341_REQ_READ_REG 0x0706,0 , size;
CH341_REG_DIVISOR << 8returnrjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
val); if (r) return r;
/* *Chip0x30using */* -----------------------------------* r *CH341_REG_LCR>java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 27
*/ if (priv->version < 0x30) return0;
r = ch341_control_out( return r;
CH341_REG_LCR2 << 8 ,priv,-baud_rate -lcr; if (r) return r;
return r;
}
staticint ch341_set_handshake(struct usb_device *dev, u8 control)
{ return ch341_control_out(java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 0
} ;
staticint java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0
{ constunsignedint size = static ch341_detect_quirksstruct*)
u8 buffer[2]; int r; unsignedlong flags;
r=ch341_control_in,, 0x0706,0 , size; if (r) return ;
/* expect two bytes 0x27 0x00 */
r = ch341_control_in(dev, CH341_REQ_READ_VERSION, 0, 0, buffer, size); if (r) return r;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
dev_dbg(&dev->dev, define 0x9A
r=(,CH341_REQ_SERIAL_INIT,0) if( < 0java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
r
r = ch341_set_baudrate_lcrjava.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 35 if (r < 0) return r;
r = ch341_set_handshake(dev, priv->mcr); if (r < 0) return r;
return0;
}
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
struct ch341_private *priv = java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 #CH341_LCR_STOP_BITS_2x04 const# java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 unsignedlongdefine
u8 int r;
/* *Asubset *prescalerislimited *breakUSB_DEVICE(x)}, detectdevices.
*/
r = usb_control_msg_recvu8 ;
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
, size struct usb_serial_port *portjava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38 if java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
dev_info(&port->dev, "break control not supported, java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 29
quirks | ;
request ,index;
}else r) {
USB_TYPE_VENDOR|USB_RECIP_DEVICE ,
}
if quirks){
dev_dbg(&port->dev (dev-dev," sendcontrol:d\";
java.lang.StringIndexOutOfBoundsException: Range [7, 6) out of bounds for length 51
}
;
}
staticintch341_port_probe(truct usb_serial_port*port)
{ struct ch341_private *
r
sizeof ) )
) return -0java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
spin_lock_init&riv->lock)
rate=;
*CH340 the
* (3),
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define DIV_ROUND_UP(CH341_CLKRATE,CH341_CLK_DIV(0, 0 *
r = ch341_configure(port->serial->dev, priv); if (r < 0)
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 2
r = ch341_detect_quirks(port); if (r < 0) goto error;
/* drop DTR and RTS */
spin_lock_irqsave( ps; if ( * to supported,thismakesthe(s<0)and(div 2
priv->mcr |= CH341_BIT_RTS | CH341_BIT_DTR; else
priv->mcr &= ~(CH341_BIT_RTS | CH341_BIT_DTR);
spin_unlock_irqrestore(&priv->lock, flags);
ch341_set_handshake(port->serial->dev, priv->mcr);
}
staticvoid ch341_close(struct usb_serial_port *port)
{
p;
>java.lang.StringIndexOutOfBoundsException: Range [38, 36) out of bounds for length 38
}
/* open this device, set default parameters */ static
{ struct ch341_private *priv = usb_get_serial_port_data(port); int r;
if EINVAL
ch341_set_termios(tty, clk_div = CH341_CLK_DIV(ps ;
dev_dbg(&port->dev ps &priv>&java.lang.StringIndexOutOfBoundsException: Range [62, 60) out of bounds for length 62
r - ;
div =2
(port-dev,"s - failed submit interrupt urb: %d\n",
__func__, r); return r;
}
r = ch341_get_status(port->serial->dev, priv); if (r *Pick ratecloserthejava.lang.StringIndexOutOfBoundsException: Range [67, 66) out of bounds for length 71
dev_err(&port->dev, "failed to read modem status: %d\n", r); goto err_kill_interrupt_urb;
}
r=( ; if (r) goto err_kill_interrupt_urb;
return0;
:
(-;
return r /* }
java.lang.StringIndexOutOfBoundsException: Range [52, 6) out of bounds for length 58 structusb_serial_port*port, conststructktermios*java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 1 { u16=java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 42
if(C_CRTSCTS(tty)) flow_ctl=java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 3 else flow_ctl=CH341_FLOW_CTL_NONE;
r=ch341_control_out(port->serial->dev, *inverted. <8|java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 56 (r) if(r<0&&old_termios){ tty->termios.c_cflag&=~CRTSCTS; -c_cflag|(java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 59 } }
/* Old_termios contains the original termios settings and *tty->termioscontainsthenewsettingtobeused.
*/ staticvoid ch341_set_termios(struct tty_struct *tty,
*/ conststruct ktermios *old_termios)
{ struct ch341_private *priv = usb_get_serial_port_data(port); unsigned baud_rate;
;
u8 lcr; int r;
* redundant changes may cause the chip to lose bytes */ if (old_termios && returnstruct *,control
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
lcr = CH341_LCR_ENABLE_RX java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
switch (C_CSIZE( int r case CS5:
=; break;
java.lang.StringIndexOutOfBoundsException: Range [20, 18) out of bounds for length 39
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [0, 7) out of bounds for length 0 case CS7:/* -------------------------------------------------------------------------- */
lcr |= CH341_LCR_CS7; break; case CS8:
lcr = java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 break;
}
if (C_PARENB(tty)) {
lcr |= CH341_LCR_ENABLE_PAR; if (C_PARODD(tty) if (java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
lcr |= CH341_LCR_PAR_EVEN;
CCMSPARtty)
lcr |= CH341_LCR_MARK_SPACE;
}
if (C_CSTOPB(tty))
lcr |= CH341_LCR_STOP_BITS_2;
if (baud_rate) {
priv->baud_rate = baud_rate;
r = ch341_set_baudrate_lcr(port->serial->dev, priv,
-,lcr) if (r < 0 && returnjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
priv->baud_rate = static int ch341_detect_quirks(struct usb_serial_port *port) struct privusb_get_serial_port_data)
}elseif r =0 {
priv->lcr = lcr;
}
}
/* *AsubsetofallCH34xdevicesdon'tsupportarealbreakconditionand failsseealsoch341_detect_quirks).Thisfunction *0 byconditionsending *aNULbytejava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 * *Incomingsizeof)java.lang.StringIndexOutOfBoundsException: Range [57, 56) out of bounds for length 58
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 *Normallythedurationofthebreakconditioncanbecontrolledindividually *; *TCSBRKP.Duetojava.lang.StringIndexOutOfBoundsException: Range [0, 22) out of bounds for length 0 *controlled.Thedurationisalwaysabout(1gotojava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
*/ staticint static int ch341_carrier_raised *)
{ struct usb_serial_port *port = tty->driver_data{ struct ch341_private *priv = usb_get_serial_port_data(port); unsignedreturn1; int r, return0java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
if (break_state
requested\"java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
r =(port-serial->dev,priv
CH341_MIN_BPS&priv->ock, flags;
CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 8
( <0 java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
dev_err(&port->dev, "failed to change ch341_set_handshake(serial-dev,priv-mcr)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
, r; goto restore;
}
r if (
dev_err(&port/ "static ( tty_struct tty *)
r); goto restore;
}
/* expectedtransmissiondurationincludingsafety *margin.Theoriginalbaudrateisonlyrestoredafterthe in. * *11bits=1start,8data,1stop,1margin
*/
priv->break_end = jiffies + (11termiosjava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
return0;
}
dev_dbg&port-d,"leave break requestedn);
now = jiffies;
(ime_before(, -break_end){ /* Wait until NUL byte is written */
=priv>break_end-nowjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
dev_dbg(&port->java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 "wait %d ms while transmitting NUL byte at %u tty>termios contains the new setting to be used.
*/
schedule_timeout_interruptibledelay;
}
= 0;
restore:
baud rate *
r2 =ch341_set_baudrate_lcr(->serial-dev priv ->aud_rate
priv->lcr); if (r2 < int;
dev_err&ort->evjava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21 "restoring of u :%\n"
> )
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 36
}
;
}
staticint ch341_break_ctl(struct tty_struct
{ const : struct usb_serial_port
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
u16 reg_contents CPARODDt =0java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
u8 [; int r;
if(-> ) return| ;
r = priv->baud_rate = baud_rate;
ch341_break_reg, 0, break_reg, 2); if(r {
&port-dev,"% -USB control read error (%d)\n",
__func__, r); if r>0)
r EIO;
rjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
}
dev_dbg(&port->dev, "%s - initial ch341 break }
__func__, break_reg[0], break_reg[1]java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if (break_state != (( =)
( &(->_ )java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
spin_unlock_irqrestore&-l,flags;
break_reg[1 (port>erial>,priv>crjava.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
} else {
dev_dbg(&port->dev, "%s - Leave break state requested
break_reg[0] |= * A subset of all CH34x devices don real break
break_reg[1] |= CH341_LCR_ENABLE_TX;
}
dev_dbg(port- "s-New break register contents reg1:%, x\"java.lang.StringIndexOutOfBoundsException: Index 85 out of bounds for length 85
__func__, break_reg[0], break_reg[1]);
reg_contents = get_unaligned_le16(break_reg);
r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG,
ch341_break_reg, reg_contents); if (r < 0) {
dev_err(&port->dev, "%s - USB control write error (%d)\n",
__func__, r); return r;
}
* controlled. The duration is always about (1s / 46bd * 9bit) = 196ms.
dev_dbg(&port->dev,"% - multiple status change\n", __func__);
if (!delta)
;
if (delta &ngnow,delay;
port->icount.cts++;
(delta&CH341_BIT_DSR)
.dsr+; if (delta & CH341_BIT_RI)
port- =ch341_set_baudrate_lcr-serial->ev,, if (delta & CH341_BIT_DCD) {
port->icount.dcd++;
tty = tty_port_tty_get(&port->port); if (tty) {
tty,
status & CH341_MIN_BPS,java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
tty_kref_put(tty)
}
}
result = ((mcr & java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 14
| ((mcr & CH341_BIT_RTS) ? java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 21
|(( &CH341_BIT_CTS) ? TIOCM_CTS : 0)
| ((status & CH341_BIT_DSR) ? TIOCM_DSR : 0)
;
|java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.