Can't understand /proc/interrupts output for GICv3 case
Ozgur Karatas
ozgurk at ieee.org
Mon Apr 11 10:53:29 EDT 2022
Re-hi,
On Mon, Apr 11, 2022 at 6:16 PM Chan Kim <ckim at etri.re.kr> wrote:
>
> > > > What bus type is your driver written for?
> > > >
> > > That sounds very logical. In my case I added it to system bus.
> >
> > What exactly do you mean by "system bus"?
> >
> I meant 'sysbus' in qemu code that I showed in the qemu code.
> And I think it's the CPU bus.
>
> >
> > Where is your kernel code?
> >
> This is the init function of my char driver. I thought if the struct cdev
> contains struct device, maybe I could use the struct device's of_node to
> call of_irq_get but it doesn't.
> And I remember I've seen the cdev in usually contained in the driver data
> of
> platform driver(?). Can I implement platform driver in kernel module form?
> Below is the char driver init code. Currently it's request_irq(6, ... ) but
> I want to know out the number 6 using program. If you have any advice,
> please tell me.
>
> static int __init chr_driver_init(void)
> {
> int ret;
> /* Allocating Major number */
> if ((alloc_chrdev_region(&dev, 0, 1, "axpu_Dev")) < 0) {
> printk(KERN_INFO"Cannot allocate the major number..\n");
> return -1;
> }
>
> printk(KERN_INFO"Major = %d Minor = %d..\n",MAJOR(dev),MINOR(dev));
>
> /* creating cdev structure */
> cdev_init(&axpu_cdev, &fops);
> axpu_cdev.owner = THIS_MODULE;
>
> /* Adding character device to the system */
> if ((cdev_add(&axpu_cdev,dev,1)) < 0) {
> printk(KERN_INFO "Cannot add the device to the
> system...\n");
> goto r_class;
> }
>
I guess you got address 0x80000 randomly also may have this code from
stackoverflow but it wont work for you.
as written stackoverflow, device_create must be a character device and an
address under /sys/dev/char before getting NULL.
So did you create a char device with use mknod command?
Actually register_chrdev will do this for you but you can do it with mknod
if you wish.
/* creating struct class */
> if ((dev_class = class_create(THIS_MODULE, "axpu_class")) == NULL)
> {
> printk(KERN_INFO "cannot create the struct class...\n");
> goto r_class;
> }
>
> /* for interrupt test !! */
> /* for vanilla work-around.. already made by mkdev */
> if ((device_create(dev_class, NULL, dev, NULL, "axpu_device")) ==
> NULL) {
> printk(KERN_INFO "cannot create the device ..\n");
> goto r_device;
> }
> else { printk(KERN_INFO "axpu_device created..\n"); }
> /**/
>
> vaddr = ioremap(AXPU_BASE, 0x80000); \
>
Please first read Documentation/devices.txt because kernel can do dynamic
allocation I think.
*
https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch03s02.html
*
https://www.oreilly.com/library/view/linux-device-drivers/0596005903/ch03.html
> if(!vaddr)
> {
> printk(KERN_INFO"Failed to map the address.\n");
> release_mem_region(AXPU_BASE,AXPU_SIZE);
> return 1;
> }
> printk("----- AXPU_BASE mapped at vaddr = %px\n", vaddr);
>
> ret = request_irq(6, axpu_irq_handler, IRQF_SHARED, "axpu_irq",
> &axpu_cdev);
> printk("request_irq returned %d\n", ret); // -EINVAL
> printk(KERN_INFO "Device driver inserted ..done properly..\n");
> return 0;
>
>
You dont need to call manual, because it is defined in cdev.h.
*
https://embeddedguruji.blogspot.com/2019/01/automatically-creating-device-nodes.html
in example for example device_destroy already destroys class.
> r_device :
> class_destroy(dev_class);
>
> r_class :
> unregister_chrdev_region(dev,1);
> return -1;
> }
>
>
it will be great that i will recommend three books to you again.
* Understanding the Linux Kernel
* Linux Device Drivers
* Linux Kernel Development
> Thank you.
> Chan Kim
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20220411/1590ac7a/attachment-0001.html>
More information about the Kernelnewbies
mailing list