Programming :: New Comer To Understanding PCI Device Drivers?
Nov 20, 2010
I have been reading some books about device driver development etc.I made a char driver of bond (dummy) device. My book says that PCI devices contain three addressable regions,configuration space,IO ports,and device memory,the book talks about a file include/linux/pci_ids.h and PCI addressing etc.I read about following functions
1) pci_read_config_
2) pci_write_config_ some thing known as offset is defined to be passed on as an argument to above functions
3) IRQ number assigned to a card function pci_read_config_byte_,configuration register offsets
4) pci_request_region I want to write a pci driver for my own understanding and I am reading some books about it.
1) Is there a dedicated forum on the net for people writing Linux drivers?
2) I've been reading over how Linux drivers are put together and even made my own dummy driver. However, before I begin writing the "real" driver I set out to write, I would like someone with some driver writing experience to verify that my knowledge is correct.
The driver I intend to write is for a PCI card. The very first thing I need is to know is the vendor ID and device ID of the card. After having that information, I can then use the pci_register_driver command to open a connection to the card. At this point, I need to use the pci_*_config_* commands (an example of a pci_*_config_* command is pci_read_config_byte) to figure out where the device is mapped in memory and what I/O ports I need. Now, the pci_* breed of commands take a parameter integer (which is an address) as there second argument. The address(es) which I will use and what they accomplish is device dependent. At this point, after having otained the I/O ports I need, I can then begin writing to them via the inb, outb, etc commands. Writing to X port will have Y result but this is vendor specific.
I am final year MCA student. I like to do my project in Linux. I know a little in C. I am pursuing RHCE certification. I am using rhel5. I am interested to write linux device drivers and willing to do my project in that.
I have started reading book Linux Device Drivers 3rd edition. So I want to know which is the best light weight distribution to use so that learning can be more generic and also does not involve distro specific nitty-gritty details. I have already tried building kernel for Ubuntu 10.04 but it involved different commands from what is mentioned in the book. So I am not sure whether I would be able to make further in the book. Has anybody tried?
As part of my job I often have to write queries in Oracle (10g) and I am experienced enough to see where I should be using an index where possible etc. Most of the time I just let the CBO come up with the best plan however sometimes it obviously doesn't!Now, I know in general that full scans of large tables aren't good however I don't fully understand an execution plan - ie, I could not look at a complex piece of code, look at it's plan and say "oh, the reason that is performing badly there is because the SBO has chosen to use nested loops rather than a hash join, so if I hint it then it will run quicker!" - this ultimately is where I'm trying to get to
I'm reading "Understanding the Linux Kernel" and came upon this assembly instruction: movl $(__KERNEL_CS << 16), %eax I am curious as to what "<<" means/does. I tried to gooogle, but google doesn't search for "<<".
I have been doing programming since the last 5 years. however, i have used to cut and paste the template without knowing in depth since i am chasing the time to finish a certain project. The title above seems easy if we read the manual, its just that im kinda confuse just for a second. Hope you guys can help me to give a better understanding for me so that i can upgrade my knowledge.Well, during my normal practice cut and paste, i try to understand this code below :-
Code: pid_t pid; pid=fork(); if (pid < 0) {perror("Erro spawning process : "); exit(EXIT_FAILURE);}
from [URL] How to remove them completely? The ipw2200 driver complains that it could not agree with certain symbols in ieee80211 module. Before taking another route, I would like to know how to completely remove the files installed by these driver packages.
I got a nice Neximage webcam for my Nexstar Telescope for Xmas so I'm trying to get it working with kstars and INDI (Instrument Neutral Distributed Interface). I'm using opensuse 11.3 (tried on both 64 bit on PC and 32 bit on my laptop) and Gnome. I've installed libindi and kstars and as many dependencies as I could find but it seems that no matter what I do I can't get any telescope drivers to appear in the device manager.
Using a Eee 900A netbook by Asus. By pressing Fn + F2, I can disable or enable the wireless chip on the netbook, a blue LED indicates the status. I've been able to connect to wireless networks just fine with this netbook. However, if the wireless chip ever becomes disabled, I have to reboot to get my network connection back. This generally happens when suspending. For some reason the LED will be off and I have to hit Fn + F2 for it to light up again.
However, after doing so, Linux will not reconnect to the network. It simply changes the wireless status from "wireless is disabled" to "device not ready". Even worse, I've recently had issues with the chip being enabled at boot, thus making it nearly impossible to get connected. I've searched around on-line but haven't found much of anything useful on this. This happens on all kinds of different distros including Ubuntu 9.10 Netbook, EeeBuntu 4 beta, Jolicloud and Ubuntu 10.04 Netbook.
Trying to install the drivers for my blackmagic intensity pro capture device and I cannot get the driver to install I get an error in the ubuntu software center saying: There seems to be a programming error in aptdaemon, the software that allows you to install/remove software and to perform other package management related tasks. Please report this error at [URL] and retry.
Details: Traceback (most recent call last): File "/usr/lib/python2.6/dist-packages/aptdaemon/worker.py", line 768, in simulate return self._simulate_helper(trans, status_path) File "/usr/lib/python2.6/dist-packages/aptdaemon/worker.py", line 851, in _simulate_helper size = int(deb["Installed-Size"]) * 1024 ValueError: invalid literal for int() with base 10: '' I have the latest ubuntu fully up-to-date.
I did searched you tube but my results were not great.I have 2 books on KernelProgramming.I feel I need if some where I can get a video tutorial which can help me to understand how to develop a Linux Device driver that will be great.I had a look at Greg Kroah Hartmans video lecture of developing patches on ......I have been reading books and a lot of stuff.So I wish if I could get a video lecture that would be better
I'm making an attempt to install drivers for my easycap dc60 USB video capture device. Someone was good enough to make a driver project on sourceforge. Problem is I cannot get it compiled.
Code: Building make[1]: Entering directory `/home/jan-bart/Download/easycap_dc60.0.4/src' make -C /usr/src/linux-headers-`uname -r` M=/home/jan-bart/Download/easycap_dc60.0.4/src modules make: Entering an unknown directory make: *** /usr/src/linux-headers-2.6.31.8-0.1-desktop: No such file or directory. Stop. make: Leaving an unknown directory
I am learning how to use DD for creating images across networks and locally but needed some clarification. 1 - When creating an image, I noticed that there is no verbose to show you the progress, How can I accomplish this?
2 - When I run this on a 8G usbstick it takes a long time to image. How can I speed up this process? PHP Code: dd if=/dev/sdb of=/home/test/images/image.dd
3 - When an image is restored like PHP Code: dd if=/home/test/images/image.dd of=/dev/sdb will that give me a working bootable usbstick? For example if I imaged a working usbstick with Ubuntu on it using DD and restored it like the example above on a different usbstick, will this give me a booting new usbstick? I hope that came across ok?
I don't quite understand how pipes work in bash. I know that it takes an output from one command as the input in another command. What an output is I can get because it's what the command prints out to the screen. But how do I know what input a command will take? Here is an example I thought would work:
Which gem | rm Unfortunately it didn't. Which gem prints out "/usr/bin/gem" so that must be the output right? I thought that was given to rm so it would be "rm /usr/bin/gem" but I was wrong. How do I know what input a command takes?
I'm trying to set up a machine to "drive" a piece of equipment (a metal plate embosser [kind of like a daisywheel printer for credit card sized pieces of metal], FWIW). What I ideally want is a linux distro that I can boot from CD (I think the term is Live CD?), log itself in as a user and display only a console. It needs to be able to support windows fileshares and python.
Essentially it needs to boot, connect to a single fileshare on a Win2k8 machine, and be able to execute a couple of scripts that will output to a serial port. One of them will be more or less the following:
wget http://WEBSITE/?<parameter passed to script> --quiet --output-document=<name of serial port>
The other is a somewhat more complicated Python script that processes a CSV spreadsheet and produces data for the machine.
I am trying to get Canon MP250 printer and scanner working in OpenSUSE 11.3 and so far I've had limited success. Both components work up to a point, but aren't fully operational.First of all, I installed the drivers from Canon website for both parts of the multifunctional device. Here's the report on the versions (it's localised, but it shouldn't be hard to understand ).
The printer works for the most part. But it fails to set images to greyscale when I request the driver to. There are some guides about that for Ubuntu, but none for openSUSE that I could find. Also, what does the setting "Amount of Extension" in the printer options do?It would also be nice if I could set the printing quality as well. Right now it seems to print everything with the default quality setting, but personally I like using lower print quality since that saves ink and makes it a little faster.
The scanner, however, is hardly usable at all. If I try to use Canon's ScanGear MP to scan, I can hear that it operates the scanner, but the program itself freezes and after a while gives me the "Cannot communicate with scanner" error. On certain settings I can also hear that the scanner itself doesn't complete the scan (the indicator on it also reports an operation in progress, but it never gets completed).If I try to use Acquire images, the native KDE scanner application, I can get it to scan, but only on very specific settings: it must scan it in colour and the resolution must be equal to or over 300 dpi. If I try anything else, the resulting image file is completely blank or I get an "Error during device I/O". And, of course, it can't save PDF files.
I'm beginning to deal with more than one user on my system (it's a VPS serving some sites) and I need to make sure I understand how group permissions work. I have an account named "admin" .. it's basically the primary account that is used for serving most of the sites that I control myself. Now, I added a second account named "Ville" as one of my users wants to be able to administer that site. So, I can do this the easy way and just chown their domains folder under the ville user, they have permission to do whatever they need be and so forth. However, let's say I want to also give the admin user access to the files (modifying and all) .. how can I put both users into the same group and give them both permission?
I've tried doing: sudo usermod -a -G admin ville To add the ville into the admin group, but ville still cannot edit files by admin. Permissions for the primary directory for the ville user are read/write for both owner and group, and the current group for the files is admin:admin .. But ville still can't write into the directory. So, what should I be doing here to get this right and secure at the same time?
I've installed ClamTK on my Kubuntu 9.10 installation, since it's connected to a Windows7 machine.When I ran a scan, it found 9 'viruses', but they are all within my home directory > Opera/mail/store and are either status Phishing.Heuristics.Email.SpoofedDomain OR HTML.Phishing.Bank-593.I recently synced my Hotmail into Opera, so I checked the corresponding dates in my Hotmail account and deleted the emails which I thought were related, however, after clearing down my Opera history, etc., re-booting my PC and re-scanning, the results are the same.How do I clear down these files?
The O'Reilly book, Linux in a Nutshell, Sixth Edition has this excerpted section (on Legacy GRUB):If GRUB is installed in the MBR, you can chainload Windows by setting the root device to the partition that has the Windows boot loader, making it the active partition, and then using the chainloader command to read the Windows boot sector.If GRUB has been installed to (hd0,0)'s MBR, then I am confused what "file" chainloader +1 is pointing to. Obviously, it is not the MBR but that is confusing to me. When one boots a Linux system with GRUB in the MBR, what file does chainloader +1 point to?
I'm trying to set up an Ubuntu server using 10.04 (64-bit), and running into problems after a couple of reconfigurations. Here's the full story:I initially built the server on a 400+GB RAID5 array, putting everything but swap in one partition. Unfortunately, I needed to repartition, putting / in the first primary partition, swap in the second partition, /var/log in the third primary partition and /home in the remaining space on the fourth primary partition.
However, at this step, I ran into some problems with UUIDs in /etc/fstab and Grub2 (I've used Linux for about 9 years, but I'm new to Ubuntu, and I haven't used UUIDs or Grub2 on Gentoo, yet). Consequently, I made the (probably not smart) decision to move back to the /dev/sdX notation I am familiar with.The problem with that is that now I need even more space on /home, so I've added a Dell Powervault and a Dell PERC5/e SATA card to my server. Now, Grub2 tries to boot from the new RAID array on the Powervault instead of the internal RAID array, so I am trying to move back to the UUID notation so that I don't have worry about /dev/sda being the internal array sometimes and the external array at other times.I don't mind being RTFM'd, but I'm having trouble finding pointers to the documentation explaining Grub2 configuration and the UUID notation. Does anyone have pointers to some readable, concise documentation on configuring this in Ubuntu?
On Windows, you can go to a file's permissions and it's clearly stated who can do what. You can choose between individual users or groups such as 'everyone' or certain types of users such as 'domain users'. You could create a clear cut list of every single user/group on the system and what their permissions for a file are and have it neatly displayed in a list.On Unix, we have octal permissions and sticky bits. I understand the whole concept of rwxrwxrwx (777). The first three are what the file owner can do, the second is what the main group the user belongs to can do, and the third is what other users can do.
But, when you view a file's permissions you are only getting the permissions as they apply to the user that owns the file. For example, as I understand it, if I viewed a file that only the root user had rwx permissions on and everyone else could only read. The permissions would show up as rwxr--r-- (744). But, those same permissions would show up to any user as 744 as well. Since the last 3 characters are what applies to "other users" (pretty vague). How would someone know what users in particular those permissions apply to? There could be one "other user" that can rwx that file and another "other user" that can't.Also, why just stop with the main group? What about other groups? A the user Foo's main group he belongs to might be Foo. But he could also belong to the groups Boo and Zoo, which belong to other users and would give him full rwx permissions over Boo and Zoo's files just as if he were Boo or Zoo.
Then you have the whole sticky bit thing that makes it so that files can be owned by the same person and at the same time be made use of (to varying degrees) by other users. To chmod the UID you'd chmod 2777 or for GID 4777 (just an an example). I did this for a file and it allowed a standard user account who was previously unable to run the command to be able to run it. But, how can that work when I didn't anywhere specify what particular user (or groups of users) that sticky bit applies to?
I'm confused about this whole thing to the point that I'm not even sure exactly what questions I should be asking or even if my examples are even 100% correct. I just sort of ranted about some specific things that floated to the top of my head. Permissions are easy to understand when your running a Unix-like system on a single user desktop. Because the only users/groups you have are root, the single user, and various system users/groups that you don't really need to worry about. So a file with rwxr--r-- means that only the Root user (not even members of his group) can edit the file and you can't unless you use sudo. Because the "other user" in the last 3 characters always just means you. But, things seem to get a whole lot more complicated when you start adding in multiple users. Can someone explain this or link to a "for dummies" article that can explain all of this to me in a way that someone who's used to Windows style permissions can make a connection between the two OS families and their way of handling these things?
I'm trying to understand the role of the at command. Does cron use at to run its jobs? Or is at, and batch for that matter, a separate cue that is only stored while the computer is on. As for anacron, anacron on runs once a day and is geared for a computer that is turned of frequently, as opposed to a server when it is on all the time. I've already man'ed these commands, and googled. I'm just trying to understand more how they work.
I am suppose to explain the dependencies that exist and each of the following lines of makefile. Lists orders to be executed as a result of running the make utility on it.