Accessing specific hardware features of mxs-lradc
Greetings,
The mxs-lradc has some hardware specific features like the DIVIDE_BY_TWO (an analog divide by two circuit that can be activated per channel).
This is not currently implemented in the driver and I was wondering what would be the way to expose and control such setting. A specific sysfs entry? Somehow through the device tree?
Is there any example of how to control a hw-specific feature in other similar iio drivers?
Best regards,
--
Hector Palacios
Hi Hector,
Quoted 7 lines
Greetings,
The mxs-lradc has some hardware specific features like the
DIVIDE_BY_TWO(an analog divide by two circuit that can be activated per channel). This is not currently implemented in the driver and I was wondering what would be the way to expose and control such setting. A specific sysfs entry? Somehow through the device tree?
The proper way would be to see of IIO doesn't already have some ways to control those (it likely does) and then these would automatically be accessible via sysfs.
Quoted 2 lines
Is there any example of how to control a hw-specific feature in other similar iio drivers?
None that I'm aware of, but I didn't look. I suspect this would be somewhere around the channel defitionion, since the /2 function of the LRADC is a per- channel feature on the LRADC.
Best regards,
Marek Vasut
Quoted 11 lines · Hector Palacios
Greetings,
The mxs-lradc has some hardware specific features like the
DIVIDE_BY_TWO(an analog divide by two circuit that can be activated per channel). This is not currently implemented in the driver and I was wondering what would be the way to expose and control such setting. A specific sysfs entry? Somehow through the device tree?Is there any example of how to control a hw-specific feature in other similar iio drivers?
This sounds as if the channel scale is programmable. There are quite a few drivers for devices which have similar features, just make the scale property writable and provide a scale_available.
- Lars
Quoted 9 lines · Lars-Peter Clausen
Quoted 8 lines · Hector Palacios
Greetings,
The mxs-lradc has some hardware specific features like the
DIVIDE_BY_TWO(an analog divide by two circuit that can be activated per channel). This is not currently implemented in the driver and I was wondering what would be the way to expose and control such setting. A specific sysfs entry? Somehow through the device tree?
Quoted 8 lines
Quoted 3 lines
Is there any example of how to control a hw-specific feature in other similar iio drivers?
This sounds as if the channel scale is programmable. There are quite a few drivers for devices which have similar features, just make the scale property writable and provide a
scale_available.
I was looking at that yesterday as I had to had a scale for the temperature sensors. You'll have to be careful because the maximum measured voltage when DIVIDE_BY_TWO is not set is 1.85V and when it is set, it becomes VDDIO - 50mv.
Also, scaling for quite a lot of channels is fixed. You'll also get channels with a fixed divider that can take DIVIDE_BY_TWO. That is quite a mess ;)
Signature · 3 lines
Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
Hello,
Quoted 19 lines · Alexandre Belloni
Quoted 9 lines · Lars-Peter Clausen
Quoted 8 lines · Hector Palacios
Greetings,
The mxs-lradc has some hardware specific features like the
DIVIDE_BY_TWO(an analog divide by two circuit that can be activated per channel). This is not currently implemented in the driver and I was wondering what would be the way to expose and control such setting. A specific sysfs entry? Somehow through the device tree?Quoted 8 lines
Quoted 3 lines
Is there any example of how to control a hw-specific feature in other similar iio drivers?
This sounds as if the channel scale is programmable. There are quite a few drivers for devices which have similar features, just make the scale property writable and provide a
scale_available.
Quoted 8 lines
I was looking at that yesterday as I had to had a scale for the temperature sensors. You'll have to be careful because the maximum measured voltage when
DIVIDE_BY_TWOis not set is 1.85V and when it is set, it becomes VDDIO - 50mv.Also, scaling for quite a lot of channels is fixed. You'll also get channels with a fixed divider that can take
DIVIDE_BY_TWO. That is quite a mess ;)
Thank you, I checked and it's easy to add custom sysfs attributes using IIO_DEVICE_ATTR(). I was thinking whether adding a divide_by_two attribute per channel:
divide_by_two0 divide_by_two1 ... divide_by_two7
or a unique divide_by_two descriptor that admits a mask value for all channels. I think the first approach (one per channel) is cleaner. Opinions?
Best regards,
--
Hector Palacios
Quoted 26 lines · Hector Palacios
Hello,
Quoted 23 lines · Alexandre Belloni
Quoted 9 lines · Lars-Peter Clausen
Quoted 8 lines · Hector Palacios
Greetings,
The mxs-lradc has some hardware specific features like the
DIVIDE_BY_TWO(an analog divide by two circuit that can be activated per channel). This is not currently implemented in the driver and I was wondering what would be the way to expose and control such setting. A specific sysfs entry? Somehow through the device tree?Quoted 8 lines
Quoted 3 lines
Is there any example of how to control a hw-specific feature in other similar iio drivers?
This sounds as if the channel scale is programmable. There are quite a few drivers for devices which have similar features, just make the scale property writable and provide a
scale_available.I was looking at that yesterday as I had to had a scale for the temperature sensors. You'll have to be careful because the maximum measured voltage when
DIVIDE_BY_TWOis not set is 1.85V and when it is set, it becomes VDDIO - 50mv.
I had a quick peak at the datasheet and I think that's a typo. VDDIO is 3.3V. This sentence also doesn't make much sense if divide by two would actually lower the range. "For input channels (other than BATT, 5V, or VDDIO) with signals larger than 1.85 V, the divide-by-two option should be set."
Quoted 9 lines
Quoted 4 lines
Also, scaling for quite a lot of channels is fixed. You'll also get channels with a fixed divider that can take
DIVIDE_BY_TWO. That is quite a mess ;)Thank you, I checked and it's easy to add custom sysfs attributes using
IIO_DEVICE_ATTR(). I was thinking whether adding adivide_by_twoattribute per channel:
Quoted 7 lines
divide_by_two0 divide_by_two1 ... divide_by_two7or a unique
divide_by_twodescriptor that admits a mask value for all channels. I think the first approach (one per channel) is cleaner. Opinions?
Just use the scale attribute for this. That's the standard way to handle this, don't invent custom interfaces if there is already a generic one.
- Lars
Quoted 28 lines · Lars-Peter Clausen
Quoted 26 lines · Hector Palacios
Hello,
Quoted 23 lines · Alexandre Belloni
Quoted 9 lines · Lars-Peter Clausen
Quoted 8 lines · Hector Palacios
Greetings,
The mxs-lradc has some hardware specific features like the
DIVIDE_BY_TWO(an analog divide by two circuit that can be activated per channel). This is not currently implemented in the driver and I was wondering what would be the way to expose and control such setting. A specific sysfs entry? Somehow through the device tree?Quoted 8 lines
Quoted 3 lines
Is there any example of how to control a hw-specific feature in other similar iio drivers?
This sounds as if the channel scale is programmable. There are quite a few drivers for devices which have similar features, just make the scale property writable and provide a
scale_available.I was looking at that yesterday as I had to had a scale for the temperature sensors. You'll have to be careful because the maximum measured voltage when
DIVIDE_BY_TWOis not set is 1.85V and when it is set, it becomes VDDIO - 50mv.
Quoted 4 lines
I had a quick peak at the datasheet and I think that's a typo. VDDIO is 3.3V. This sentence also doesn't make much sense if divide by two would actually lower the range. "For input channels (other than BATT, 5V, or VDDIO) with signals larger than 1.85 V, the divide-by-two option should be set."
Uhm, ignore this, parse error on my side. I thought the dash was a hyphen not a minus.
Quoted 23 lines
Quoted 10 lines
Quoted 5 lines
Also, scaling for quite a lot of channels is fixed. You'll also get channels with a fixed divider that can take
DIVIDE_BY_TWO. That is quite a mess ;)Thank you, I checked and it's easy to add custom sysfs attributes using
IIO_DEVICE_ATTR(). I was thinking whether adding adivide_by_twoattribute per channel:Quoted 7 lines
divide_by_two0 divide_by_two1 ... divide_by_two7or a unique
divide_by_twodescriptor that admits a mask value for all channels. I think the first approach (one per channel) is cleaner. Opinions?Just use the scale attribute for this. That's the standard way to handle this, don't invent custom interfaces if there is already a generic one.
- Lars
Quoted 11 lines · Lars-Peter Clausen
Quoted 5 lines
Quoted 5 lines
I was looking at that yesterday as I had to had a scale for the temperature sensors. You'll have to be careful because the maximum measured voltage when
DIVIDE_BY_TWOis not set is 1.85V and when it is set, it becomes VDDIO - 50mv.I had a quick peak at the datasheet and I think that's a typo. VDDIO is 3.3V. This sentence also doesn't make much sense if divide by two would actually lower the range. "For input channels (other than BATT, 5V, or VDDIO) with signals larger than 1.85 V, the divide-by-two option should be set."
Yeah, what I think they meant is if !DIVIDE_BY_TWO : Vmax = 1.85V else Vmax = 3.25V. So it may not be as easy as multiplying hte scale by two. I couldn't test it, so I didn't implement it.
Quoted 14 lines
Quoted 14 lines
Quoted 4 lines
Also, scaling for quite a lot of channels is fixed. You'll also get channels with a fixed divider that can take
DIVIDE_BY_TWO. That is quite a mess ;)Thank you, I checked and it's easy to add custom sysfs attributes using
IIO_DEVICE_ATTR(). I was thinking whether adding adivide_by_twoattribute per channel:divide_by_two0 divide_by_two1 ... divide_by_two7
Quoted 6 lines
Quoted 2 lines
or a unique
divide_by_twodescriptor that admits a mask value for all channels. I think the first approach (one per channel) is cleaner. Opinions?Just use the scale attribute for this. That's the standard way to handle this, don't invent custom interfaces if there is already a generic one.
Hector, you can have a look at what I did there:
http://marc.info/?l=linux-iio&m=137269905605960&w=2
Add IIO_CHAN_INFO_SCALE to .info_mask_separate in the MXS_ADC_CHAN macro. Then, implement the scaling in the switch case in mxs_lradc_read_raw and you'll probably also want to implement a write_raw.
Signature · 3 lines
Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
Quoted 13 lines · Alexandre Belloni
Quoted 11 lines · Lars-Peter Clausen
Quoted 5 lines
Quoted 5 lines
I was looking at that yesterday as I had to had a scale for the temperature sensors. You'll have to be careful because the maximum measured voltage when
DIVIDE_BY_TWOis not set is 1.85V and when it is set, it becomes VDDIO - 50mv.I had a quick peak at the datasheet and I think that's a typo. VDDIO is 3.3V. This sentence also doesn't make much sense if divide by two would actually lower the range. "For input channels (other than BATT, 5V, or VDDIO) with signals larger than 1.85 V, the divide-by-two option should be set."
Quoted 3 lines
Yeah, what I think they meant is if !DIVIDE_BY_TWO : Vmax = 1.85V else Vmax = 3.25V. So it may not be as easy as multiplying hte scale by two. I couldn't test it, so I didn't implement it.
Parse error on my side, in the datasheet it is a hyphen not a minus, so I though the sentence meant that the maximum is 50mV.
I guess it is still a divide by two, but since the max input voltage is 3.3V you simply can't max out the ADC anymore since the maximum value corresponds to 3.7V
-Lars