From nobody Tue Feb 10 09:10:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=telecom-paris.fr ARC-Seal: i=1; a=rsa-sha256; t=1710672109; cv=none; d=zohomail.com; s=zohoarc; b=Jf14jy8uKy4jgmVfaNwtcXDmTCrRbCf0Ho/N8BEp4HyP1Sl2wUEKL98B7dZBf3MNKGhZAWpaFL0cX47NHrd/gwogvsRQBPQidnMkLwkvcCS0boj6aRuyvxCVFXW9FmnWnwqlfSamYGDWdubu9MREuFTpHlz0eoKF6cCCbUwatFo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710672109; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1onEwCpqfWs3uwQN5dyXddcXZJMtBvmrzTYx9qNJtUc=; b=En3iwatzKksKStkw29zdtYH4W7V9giHWlKj8Lds6Zfw3cHm8q5scPsGQAVQhwjN9iSk5k5RqH7maUaMv8Dvr02fF0rbEyFq8jLOKgXZEyAH7v+U/qhyJMPvP6N6VaQDXV1M7WLovUxvBB2PFFNgbWPJ0OgD1cxXMMv6vc02RIkU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 171067210904111.658479749401067; Sun, 17 Mar 2024 03:41:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rlnxV-0003Io-Mt; Sun, 17 Mar 2024 06:41:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rlnxA-0002qG-Gf; Sun, 17 Mar 2024 06:41:23 -0400 Received: from zproxy4.enst.fr ([137.194.2.223]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rlnx5-0001PV-T8; Sun, 17 Mar 2024 06:41:18 -0400 Received: from localhost (localhost [IPv6:::1]) by zproxy4.enst.fr (Postfix) with ESMTP id 59231207EB; Sun, 17 Mar 2024 11:41:12 +0100 (CET) Received: from zproxy4.enst.fr ([IPv6:::1]) by localhost (zproxy4.enst.fr [IPv6:::1]) (amavis, port 10032) with ESMTP id UDVJRWpCNm4Y; Sun, 17 Mar 2024 11:41:11 +0100 (CET) Received: from localhost (localhost [IPv6:::1]) by zproxy4.enst.fr (Postfix) with ESMTP id 822FB205F4; Sun, 17 Mar 2024 11:41:11 +0100 (CET) Received: from zproxy4.enst.fr ([IPv6:::1]) by localhost (zproxy4.enst.fr [IPv6:::1]) (amavis, port 10026) with ESMTP id Lg13qi5U1sfI; Sun, 17 Mar 2024 11:41:11 +0100 (CET) Received: from AM-Inspiron-3585.. (cust-west-par-46-193-4-103.cust.wifirst.net [46.193.4.103]) by zproxy4.enst.fr (Postfix) with ESMTPSA id E754520619; Sun, 17 Mar 2024 11:41:10 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.10.3 zproxy4.enst.fr 822FB205F4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=telecom-paris.fr; s=A35C7578-1106-11E5-A17F-C303FDDA8F2E; t=1710672071; bh=1onEwCpqfWs3uwQN5dyXddcXZJMtBvmrzTYx9qNJtUc=; h=From:To:Date:Message-Id:MIME-Version; b=JgxK8xvPKc0WlTe97dUlOEyaF8teNCGdPK5hNnJnyA3GRjl/8H9kRb7PRBKAvzb8p EYQHE8Bd4Q02Kbl++jsIK7qqdhN7QwpMHlTwdPN615j3iTDQD+nBcQ9FLy8YZPmE2W 7ZVR+zmYe2PXViM//d9Yimx2y27bY6ilUi2faUF4= X-Virus-Scanned: amavis at enst.fr From: Arnaud Minier To: qemu-devel@nongnu.org Cc: Samuel Tardieu , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alistair Francis , Paolo Bonzini , =?UTF-8?q?In=C3=A8s=20Varhol?= , Peter Maydell , qemu-arm@nongnu.org, Laurent Vivier , Thomas Huth , Arnaud Minier Subject: [PATCH 5/7] hw/char/stm32l4x5_usart: Add options for serial parameters setting Date: Sun, 17 Mar 2024 11:39:16 +0100 Message-Id: <20240317103918.44375-6-arnaud.minier@telecom-paris.fr> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240317103918.44375-1-arnaud.minier@telecom-paris.fr> References: <20240317103918.44375-1-arnaud.minier@telecom-paris.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=137.194.2.223; envelope-from=arnaud.minier@telecom-paris.fr; helo=zproxy4.enst.fr X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @telecom-paris.fr) X-ZM-MESSAGEID: 1710672111090100005 Content-Type: text/plain; charset="utf-8" Add a function to change the settings of the serial connection. Signed-off-by: Arnaud Minier Signed-off-by: In=C3=A8s Varhol --- hw/char/stm32l4x5_usart.c | 97 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/hw/char/stm32l4x5_usart.c b/hw/char/stm32l4x5_usart.c index 958d05a56d..95e792d09d 100644 --- a/hw/char/stm32l4x5_usart.c +++ b/hw/char/stm32l4x5_usart.c @@ -165,6 +165,91 @@ static int stm32l4x5_usart_base_can_receive(void *opaq= ue) return 0; } =20 +static void stm32l4x5_update_params(Stm32l4x5UsartBaseState *s) +{ + int speed, parity, data_bits, stop_bits; + uint32_t value, usart_div; + QEMUSerialSetParams ssp; + + /* Select the parity type */ + if (s->cr1 & R_CR1_PCE_MASK) { + if (s->cr1 & R_CR1_PS_MASK) { + parity =3D 'O'; + } else { + parity =3D 'E'; + } + } else { + parity =3D 'N'; + } + + /* Select the number of stop bits */ + value =3D FIELD_EX32(s->cr2, CR2, STOP); + if (value =3D=3D 0b00) { + stop_bits =3D 1; + } else if (value =3D=3D 0b10) { + stop_bits =3D 2; + } else { + /* TODO: raise an error here */ + stop_bits =3D 1; + error_report( + "UNIMPLEMENTED: fractionnal stop bits; CR2[13:12] =3D %x", + value); + return; + } + + /* Select the length of the word */ + value =3D (FIELD_EX32(s->cr1, CR1, M1) << 1) | FIELD_EX32(s->cr1, CR1,= M0); + if (value =3D=3D 0b00) { + data_bits =3D 8; + } else if (value =3D=3D 0b01) { + data_bits =3D 9; + } else if (value =3D=3D 0b01) { + data_bits =3D 7; + } else { + /* TODO: Raise an error here */ + data_bits =3D 8; + error_report("UNDEFINED: invalid word length, CR1.M =3D 0b11"); + return; + } + + /* Select the baud rate */ + value =3D FIELD_EX32(s->brr, BRR, BRR); + if (value < 16) { + /* TODO: Raise an error here */ + error_report("UNDEFINED: BRR lesser than 16: %u", value); + return; + } + + if (FIELD_EX32(s->cr1, CR1, OVER8) =3D=3D 0) { + /* + * Oversampling by 16 + * BRR =3D USARTDIV + */ + usart_div =3D value; + } else { + /* + * Oversampling by 8 + * - BRR[2:0] =3D USARTDIV[3:0] shifted 1 bit to the right. + * - BRR[3] must be kept cleared. + * - BRR[15:4] =3D USARTDIV[15:4] + * - The frequency is multiplied by 2 + */ + usart_div =3D ((value & 0xFFF0) | ((value & 0x0007) << 1)) / 2; + } + + speed =3D clock_get_hz(s->clk) / usart_div; + + ssp.speed =3D speed; + ssp.parity =3D parity; + ssp.data_bits =3D data_bits; + ssp.stop_bits =3D stop_bits; + + qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); + + trace_stm32l4x5_usart_update_params( + speed, parity, data_bits, stop_bits, 0); +} + static void stm32l4x5_update_irq(Stm32l4x5UsartBaseState *s) { if (((s->isr & R_ISR_WUF_MASK) && (s->cr3 & R_CR3_WUFIE_MASK)) = || @@ -318,16 +403,19 @@ static void stm32l4x5_usart_base_write(void *opaque, = hwaddr addr, switch (addr) { case A_CR1: s->cr1 =3D value; + stm32l4x5_update_params(s); stm32l4x5_update_irq(s); return; case A_CR2: s->cr2 =3D value; + stm32l4x5_update_params(s); return; case A_CR3: s->cr3 =3D value; return; case A_BRR: s->brr =3D value; + stm32l4x5_update_params(s); return; case A_GTPR: s->gtpr =3D value; @@ -409,10 +497,19 @@ static void stm32l4x5_usart_base_init(Object *obj) s->clk =3D qdev_init_clock_in(DEVICE(s), "clk", NULL, s, 0); } =20 +static int stm32l4x5_usart_base_post_load(void *opaque, int version_id) +{ + Stm32l4x5UsartBaseState *s =3D (Stm32l4x5UsartBaseState *)opaque; + + stm32l4x5_update_params(s); + return 0; +} + static const VMStateDescription vmstate_stm32l4x5_usart_base =3D { .name =3D TYPE_STM32L4X5_USART_BASE, .version_id =3D 1, .minimum_version_id =3D 1, + .post_load =3D stm32l4x5_usart_base_post_load, .fields =3D (VMStateField[]) { VMSTATE_UINT32(cr1, Stm32l4x5UsartBaseState), VMSTATE_UINT32(cr2, Stm32l4x5UsartBaseState), --=20 2.34.1