2021-08-09 08:00:33

by Muni Sekhar

[permalink] [raw]
Subject: read() via USB bus

Hi all,

PCIe memory mapped registers can be read via readb(), readw(), readl()
kernel API's. Similarly what are the kernel API to read the device
registers via USB bus

--
Thanks,
Sekhar


2021-08-09 08:46:20

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: read() via USB bus

On Mon, Aug 09, 2021 at 10:15:29AM +0200, Oliver Neukum wrote:
>
> On 09.08.21 09:58, Muni Sekhar wrote:
> > Hi all,
> >
> > PCIe memory mapped registers can be read via readb(), readw(), readl()
> > kernel API's. Similarly what are the kernel API to read the device
> > registers via USB bus
> >
>
> Hi,
>
> I am afraid this is based on a fundamental misunderstanding on how
> USB works. It is based on passing messages, not reading and writing
> registers.
>
> USB devices are primarily based on endpoints, not registers. A literal
> answer to your question would point you to the clear/set/get_feature
> standard requests of chapter 9 of the specification, but that really
> will not help you, as you are making assumption that fundamentally
> do not apply.
>
> I hope this list stays friendly to newcomers and we will answer
> specific questions, but at this point I must advise you to first
> read an introductory book.

Along these lines, take a look at the book, Linux Device Drivers, third
edition, which is free online, as it has a chapter about USB drivers and
how they work. That should help you out to understand the issues
involved with USB devices.

If you have specific questions after looking at that, and reading the
basic usb-skeleton.c driver in the kernel source tree, please let us
know!

thanks,

greg k-h

2021-08-09 09:55:26

by Oliver Neukum

[permalink] [raw]
Subject: Re: read() via USB bus


On 09.08.21 09:58, Muni Sekhar wrote:
> Hi all,
>
> PCIe memory mapped registers can be read via readb(), readw(), readl()
> kernel API's. Similarly what are the kernel API to read the device
> registers via USB bus
>

Hi,

I am afraid this is based on a fundamental misunderstanding on how
USB works. It is based on passing messages, not reading and writing
registers.

USB devices are primarily based on endpoints, not registers. A literal
answer to your question would point you to the clear/set/get_feature
standard requests of chapter 9 of the specification, but that really
will not help you, as you are making assumption that fundamentally
do not apply.

I hope this list stays friendly to newcomers and we will answer
specific questions, but at this point I must advise you to first
read an introductory book.

    HTH
        Oliver


2021-08-09 16:22:01

by Muni Sekhar

[permalink] [raw]
Subject: Re: read() via USB bus

On Mon, Aug 9, 2021 at 1:45 PM Oliver Neukum <[email protected]> wrote:
>
>
> On 09.08.21 09:58, Muni Sekhar wrote:
> > Hi all,
> >
> > PCIe memory mapped registers can be read via readb(), readw(), readl()
> > kernel API's. Similarly what are the kernel API to read the device
> > registers via USB bus
> >
>
> Hi,
>
> I am afraid this is based on a fundamental misunderstanding on how
> USB works. It is based on passing messages, not reading and writing
> registers.
>
> USB devices are primarily based on endpoints, not registers. A literal
> answer to your question would point you to the clear/set/get_feature
> standard requests of chapter 9 of the specification, but that really
> will not help you, as you are making assumption that fundamentally
> do not apply.
>
> I hope this list stays friendly to newcomers and we will answer
> specific questions, but at this point I must advise you to first
> read an introductory book.
Thank you, I will check it out.
>
> HTH
> Oliver
>
>


--
Thanks,
Sekhar

2021-08-10 16:37:18

by Muni Sekhar

[permalink] [raw]
Subject: Re: read() via USB bus

On Mon, Aug 9, 2021 at 1:45 PM Oliver Neukum <[email protected]> wrote:
>
>
> On 09.08.21 09:58, Muni Sekhar wrote:
> > Hi all,
> >
> > PCIe memory mapped registers can be read via readb(), readw(), readl()
> > kernel API's. Similarly what are the kernel API to read the device
> > registers via USB bus
> >
>
> Hi,
>
> I am afraid this is based on a fundamental misunderstanding on how
> USB works. It is based on passing messages, not reading and writing
> registers.

I am referring to the code mentioned in
https://patchwork.kernel.org/project/linux-arm-msm/patch/[email protected]/

As per this driver gets access to the Qcomm’s USB h/w device registers
via devm_extcon_dev_allocate(), devm_extcon_dev_register(),
platform_get_resource() and devm_ioremap_resource API’s.

What does the USB external connector EXTCON_USB \ EXTCON_USB_HOST
devices means? Are these different from normal USB devices?


>
> USB devices are primarily based on endpoints, not registers. A literal
> answer to your question would point you to the clear/set/get_feature
> standard requests of chapter 9 of the specification, but that really
> will not help you, as you are making assumption that fundamentally
> do not apply.
>
> I hope this list stays friendly to newcomers and we will answer
> specific questions, but at this point I must advise you to first
> read an introductory book.
>
> HTH
> Oliver
>
>


--
Thanks,
Sekhar

2021-08-10 16:40:25

by Oliver Neukum

[permalink] [raw]
Subject: Re: read() via USB bus


On 10.08.21 16:13, Muni Sekhar wrote:
> On Mon, Aug 9, 2021 at 1:45 PM Oliver Neukum <[email protected]> wrote:
>>
>> On 09.08.21 09:58, Muni Sekhar wrote:
>>> Hi all,
>>>
>>> PCIe memory mapped registers can be read via readb(), readw(), readl()
>>> kernel API's. Similarly what are the kernel API to read the device
>>> registers via USB bus
>>>
>> Hi,
>>
>> I am afraid this is based on a fundamental misunderstanding on how
>> USB works. It is based on passing messages, not reading and writing
>> registers.
> I am referring to the code mentioned in
> https://patchwork.kernel.org/project/linux-arm-msm/patch/[email protected]/
>
> As per this driver gets access to the Qcomm’s USB h/w device registers
> via devm_extcon_dev_allocate(), devm_extcon_dev_register(),
> platform_get_resource() and devm_ioremap_resource API’s.
>
> What does the USB external connector EXTCON_USB \ EXTCON_USB_HOST
> devices means? Are these different from normal USB devices?
>
Hi,

those are not USB devices. Those are devices associated with a USB bus
and are to be
found on the host's CPU's bus. This is like a graphics card is from the
driver's view
not a DisplayPort device or a SCSI controller is not a SCSI device for
its driver.

A host controller and associated devices can be on any bus. Such
controllers follow
their separate specifications and how they are to be driven is strictly
speaking
not part of USB:

    Regards
        Oliver


2021-08-11 10:08:50

by Oliver Neukum

[permalink] [raw]
Subject: Re: read() via USB bus


On 10.08.21 21:27, Muni Sekhar wrote:
>
> Any other examples of devices associated with the USB bus? Do we have
> any reference driver in the mainline kernel tree?


No, not really. We have the debug serial drivers,
but they are associated with a host controller
as such.

> Does lsusb reports these devices?
No.

    Regards
        Oliver

2021-08-12 10:10:39

by Fabio M. De Francesco

[permalink] [raw]
Subject: LDD 3rd ed. - It was: Re: read() via USB bus

Hi Greg,

On Monday, August 9, 2021 10:44:23 AM CEST Greg KH wrote:
> On Mon, Aug 09, 2021 at 10:15:29AM +0200, Oliver Neukum wrote:
> > On 09.08.21 09:58, Muni Sekhar wrote:
> > > Hi all,
> > >
> > > PCIe memory mapped registers can be read via readb(), readw(), readl()
> > > kernel API's. Similarly what are the kernel API to read the device
> > > registers via USB bus
> >
> > [...]
> >
> > I hope this list stays friendly to newcomers and we will answer
> > specific questions, but at this point I must advise you to first
> > read an introductory book.
>
> Along these lines, take a look at the book, Linux Device Drivers, third
> edition, which is free online, as it has a chapter about USB drivers and
> how they work. That should help you out to understand the issues
> involved with USB devices.
>
I've heard that your book, LDD 3rd edition, has become obsolete a long time
ago and most sample code cannot anymore build. Reading what you wrote above
seems to contradict what I've been told by others... I must admit that I've
just had a print copy of it that I have not yet opened for reading, therefore
maybe that I'm totally wrong in assuming the above.

Do you mind to elaborate a bit more on this subject, please? I mean: can you
point out which chapters, which content, should be skipped (if there's really
something which is no more correct/relevant to today's practice of drivers
development and kernel hacking?

One more question, please... if after carefully studying its content, someone
wanted to change and update part of the book content to reflect the changes in
Linux API and in the current best practices, would it be (legally) allowed to
publish a v4 on GitHub for the convenience of everyone interested in learning
for free? However, I understand that it would be not so easy to come up with a
good and error free text if not addressed as a public long term project and
I'm also not sure of what tools are needed to edit PDF files. (At the moment
my question is for a hypothetical scenario, just to know whether or not it
would be technically and legally doable).

I suppose that the answers to the above questions might be of interest to a
lot of newcomers like me, so please, if you have time, I'd appreciate to read
your reply.

Thanks,

Fabio
>
> If you have specific questions after looking at that, and reading the
> basic usb-skeleton.c driver in the kernel source tree, please let us
> know!
>
> thanks,
>
> greg k-h




2021-08-12 10:40:28

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: LDD 3rd ed. - It was: Re: read() via USB bus

On Thu, Aug 12, 2021 at 11:45:45AM +0200, Fabio M. De Francesco wrote:
> Hi Greg,
>
> On Monday, August 9, 2021 10:44:23 AM CEST Greg KH wrote:
> > On Mon, Aug 09, 2021 at 10:15:29AM +0200, Oliver Neukum wrote:
> > > On 09.08.21 09:58, Muni Sekhar wrote:
> > > > Hi all,
> > > >
> > > > PCIe memory mapped registers can be read via readb(), readw(), readl()
> > > > kernel API's. Similarly what are the kernel API to read the device
> > > > registers via USB bus
> > >
> > > [...]
> > >
> > > I hope this list stays friendly to newcomers and we will answer
> > > specific questions, but at this point I must advise you to first
> > > read an introductory book.
> >
> > Along these lines, take a look at the book, Linux Device Drivers, third
> > edition, which is free online, as it has a chapter about USB drivers and
> > how they work. That should help you out to understand the issues
> > involved with USB devices.
> >
> I've heard that your book, LDD 3rd edition, has become obsolete a long time
> ago and most sample code cannot anymore build. Reading what you wrote above
> seems to contradict what I've been told by others... I must admit that I've
> just had a print copy of it that I have not yet opened for reading, therefore
> maybe that I'm totally wrong in assuming the above.

Look into it and see the differences, it's not hard to notice.

And the code samples are all up to date online on github somewhere,
there's people keeping them alive if you want to track them down, but
really, just look at the in-kernel drivers for better examples of real
drivers.

> Do you mind to elaborate a bit more on this subject, please? I mean: can you
> point out which chapters, which content, should be skipped (if there's really
> something which is no more correct/relevant to today's practice of drivers
> development and kernel hacking?

I am not going to create a study guide like this, sorry, I've already
given away the book for free to you :)

> One more question, please... if after carefully studying its content, someone
> wanted to change and update part of the book content to reflect the changes in
> Linux API and in the current best practices, would it be (legally) allowed to
> publish a v4 on GitHub for the convenience of everyone interested in learning
> for free? However, I understand that it would be not so easy to come up with a
> good and error free text if not addressed as a public long term project and
> I'm also not sure of what tools are needed to edit PDF files. (At the moment
> my question is for a hypothetical scenario, just to know whether or not it
> would be technically and legally doable).

Please see the license of the book for what you are, and are not,
allowed to do with it to answer this question.

thanks,

greg k-h

2021-08-12 10:56:06

by Robert P. J. Day

[permalink] [raw]
Subject: Re: LDD 3rd ed. - It was: Re: read() via USB bus

On Thu, 12 Aug 2021, Greg KH wrote:

> On Thu, Aug 12, 2021 at 11:45:45AM +0200, Fabio M. De Francesco wrote:
> > Hi Greg,
> >
> > On Monday, August 9, 2021 10:44:23 AM CEST Greg KH wrote:
> > > On Mon, Aug 09, 2021 at 10:15:29AM +0200, Oliver Neukum wrote:
> > > > On 09.08.21 09:58, Muni Sekhar wrote:
> > > > > Hi all,
> > > > >
> > > > > PCIe memory mapped registers can be read via readb(), readw(), readl()
> > > > > kernel API's. Similarly what are the kernel API to read the device
> > > > > registers via USB bus
> > > >
> > > > [...]
> > > >
> > > > I hope this list stays friendly to newcomers and we will answer
> > > > specific questions, but at this point I must advise you to first
> > > > read an introductory book.
> > >
> > > Along these lines, take a look at the book, Linux Device Drivers, third
> > > edition, which is free online, as it has a chapter about USB drivers and
> > > how they work. That should help you out to understand the issues
> > > involved with USB devices.
> > >
> > I've heard that your book, LDD 3rd edition, has become obsolete a long time
> > ago and most sample code cannot anymore build. Reading what you wrote above
> > seems to contradict what I've been told by others... I must admit that I've
> > just had a print copy of it that I have not yet opened for reading, therefore
> > maybe that I'm totally wrong in assuming the above.
>
> Look into it and see the differences, it's not hard to notice.
>
> And the code samples are all up to date online on github somewhere,
> there's people keeping them alive if you want to track them down,
> but really, just look at the in-kernel drivers for better examples
> of real drivers.

it's possibly worth mentioning that a chap named javier martinez has
been doing a decent job of upgrading the examples from LDD3 to keep up
with current kernel development:

https://github.com/martinezjavier/ldd3

of course, those examples won't match the explanations in the book
anymore, but still, worth perusing.

rday

2021-08-12 12:19:56

by Valdis Klētnieks

[permalink] [raw]
Subject: Re: LDD 3rd ed. - It was: Re: read() via USB bus

On Thu, 12 Aug 2021 11:45:45 +0200, "Fabio M. De Francesco" said:

> I've heard that your book, LDD 3rd edition, has become obsolete a long time
> ago and most sample code cannot anymore build. Reading what you wrote above
> seems to contradict what I've been told by others... I must admit that I've
> just had a print copy of it that I have not yet opened for reading, therefore
> maybe that I'm totally wrong in assuming the above.

The APIs have all changed a lot since the 3rd edition.

The concepts haven't changed that much. And given that the in-kernel APIs
have *always* been a moving target, being able to deal with the fact that
a given function now takes a 'struct foo*' rather than a 'struct bar *' is a very
necessary skill for anybody who's planning to do serious kernel work.



Attachments:
(No filename) (505.00 B)