Skip to contentSkip to conversation

Accessing specific hardware features of mxs-lradc

DISCUSSION Hector Palacios 4 participants 9 messages Jul 2, 2013 IIO

lore
Share & tools
lore
#0 lore raw

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

#1 lore raw

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

#2 lore raw
In reply to Hector Palacios
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

#3 lore raw
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
#4 lore raw

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_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 ;)

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

#5 lore raw
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_TWO is 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 a divide_by_two attribute per channel:

Quoted 7 lines
    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?

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

#6 lore raw
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_TWO is 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 a divide_by_two attribute per channel:

Quoted 7 lines
    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?

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

#7 lore raw
In reply to Lars-Peter Clausen
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_TWO is 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 a divide_by_two attribute per channel:

    divide_by_two0
    divide_by_two1
    ...
    divide_by_two7
Quoted 6 lines
Quoted 2 lines

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?

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
#8 lore raw
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_TWO is 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