1 // 2 // Copyright (c) 2010-2024 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 using Antmicro.Renode.Core; 8 using Antmicro.Renode.Time; 9 10 namespace Antmicro.Renode.Peripherals.UART 11 { 12 public static class LINHubExtensions 13 { CreateLINHub(this Emulation emulation, string name)14 public static void CreateLINHub(this Emulation emulation, string name) 15 { 16 emulation.ExternalsManager.AddExternal(new LINHub(), name); 17 } 18 } 19 20 public sealed class LINHub : UARTHubBase<ILINDevice> 21 { LINHub()22 public LINHub() : base(true) {} 23 AttachTo(ILINDevice lin)24 public override void AttachTo(ILINDevice lin) 25 { 26 base.AttachTo(lin); 27 if(lin is ILINController linController) 28 { 29 linController.BroadcastLINBreak += HandleLINBreak; 30 } 31 } 32 DetachFrom(ILINDevice lin)33 public override void DetachFrom(ILINDevice lin) 34 { 35 if(lin is ILINController linController) 36 { 37 linController.BroadcastLINBreak -= HandleLINBreak; 38 } 39 base.DetachFrom(lin); 40 } 41 HandleLINBreak()42 private void HandleLINBreak() 43 { 44 if(!started) 45 { 46 return; 47 } 48 49 lock(locker) 50 { 51 foreach(var item in uarts.Keys) 52 { 53 item.GetMachine().HandleTimeDomainEvent<object>(_ => item.ReceiveLINBreak(), null, TimeDomainsManager.Instance.VirtualTimeStamp); 54 } 55 } 56 } 57 } 58 } 59