lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Thu, 2 May 2024 18:43:01 +0200
From: Peter Rosin <peda@...ntia.se>
To: Jonathan Cameron <Jonathan.Cameron@...wei.com>
Cc: João Paulo Gonçalves
 <jpaulo.silvagoncalves@...il.com>, linux-iio@...r.kernel.org,
 linux-kernel@...r.kernel.org, joao.goncalves@...adex.com
Subject: Re: Supporting a Device with Switchable Current/Voltage Measurement



2024-05-02 at 17:09, Jonathan Cameron wrote:
> On Thu, 2 May 2024 16:05:45 +0200
> Peter Rosin <peda@...ntia.se> wrote:
> 
>> 2024-05-02 at 15:49, Peter Rosin wrote:
>>> Since you appear to need to change both the gpio pin and the io-channel, the
>>> mux isn't a perfect fit. The closest you can get with the current code is to
>>> create a gpio mux, I think. You would then use that mux twice to fan out both
>>> io-channels, but only expose the "left leg" on the first fan-out and only the
>>> "right leg" on the other. Something like this (untested, probably riddled with
>>> errors, use salt etc etc):
>>>
>>> rcs: raw-current-sense {
>>> 	compatible = "current-sense-shunt";
>>> 	io-channels = <&adc 0>;
>>> 	io-channel-name = "raw-current";
>>> 	#io-channel-cells = <1>;
>>>
>>> 	shunt-resistor-micro-ohms = <3300000>;
>>> };
>>>
>>> rvs: raw-voltage-sense {
>>> 	compatible = "voltage-divider";
>>> 	io-channels = <&adc 1>;
>>> 	io-channel-name = "raw-voltage";
>>> 	#io-channel-cells = <1>;
>>>
>>> 	output-ohms = <22>;
>>> 	full-ohms = <222>;
>>> };
>>>
>>> mux: gpio-mux {
>>> 	compatible = "gpio-mux";
>>> 	#mux-control-cells = <0>;
>>>
>>> 	gpios-mux = <&main_gpio0 29 GPIO_ACTIVE_HIGH>;
>>> };
>>>
>>> current-sense {
>>> 	compatible = "io-channel-mux";
>>> 	io-channels = <&rcs 0>;
>>> 	io-channel-names = "parent";
>>>
>>> 	mux-controls = <&mux>;
>>>
>>> 	channels = "current", "";
>>> };
>>>
>>> voltage-sense {
>>> 	compatible = "io-channel-mux";
>>> 	io-channels = <&rvs 0>;
>>> 	io-channel-names = "parent";
>>>
>>> 	mux-controls = <&mux>;
>>>
>>> 	channels = "", "voltage";
>>> };
>>>
>>> What the mux solves is exclusion, so that the gpio pin is locked while
>>> measurement is made on either current-sense or voltage-sense.
>>>
>>> However, the channels from the raw-{current,voltage}-sense nodes are exposed
>>> to user space, and it will be possible to make "raw" measurements without
>>> regard to how the gpio pin is set. That will of course not yield the desired
>>> results, but is also a user error and might not be a big problem?  
>>
>> I just realized that it's also possible to do this "the other way around". Maybe
>> that makes more sense?
> Ah, I'd failed to realize that this is about routing a single wire
> through two different analog circuits that end on 'different' ADC inputs.
> 
> Pictures would help me out btw!  Everyone loves ascii art.

Certainly! :-)

> Anyhow, I 'think' what you have here should work.

Also, on ordinary multimeters it is quite easy to blow the fuse for the current
loop. Assuming that measuring current is more sensitive, the following addition
might be in order?

@mux {
	idle-state = 1;
};

Cheers,
Peter

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ