--- In [email protected], "Geert Vancompernolle"
<[EMAIL PROTECTED]> wrote:
>
> --- In [email protected], "Ernst Mayerhofer"
> <ernst.mayerhofer@> wrote:
> >
> > hi,
> > 
> > you can create the node in /etc, instead of /dev, dynamically.
> > 
> > 
> Hi Ernst,
> 
> Your proposal is working perfect!  Let me explain the steps I took to
> get the device number dynamically allocated...
> 
> 1. In the file
> "devboard-R2_01/os/linux-2.6/arch/cris/arch-v10/drivers/i2c", I did
> the following modifications to have the MAJOR number assigned
dynamically:
> 
> * Added the following #includes:
> 
> #include <linux/types.h> /* for dev_t */
> #include <linux/cdev.h>  /* for struct cdev */
> 
> * In the function "static int __init i2c_register( void )":
> 
> - Added the following variables:
> 
>     dev_t devt;
>     struct cdev *my_i2cdev = NULL;
> 
> - Replaced the code
> 
>     res = register_chrdev( I2C_MAJOR, i2c_name, &i2c_fops );
>       
>     if ( res < 0 ) 
>     {
>         printk( KERN_ERR "i2c: couldn't get a major number.\n" );
>       return res;
>     }
> 
>   with the code 
> 
>     res = alloc_chrdev_region( &devt, 0, 1, i2c_name );
>     
>     if ( res < 0 )
>     {
>         printk( KERN_INFO "i2cgvc: couldn't get a major number
> dynamically allocated.\n" );
>         return ( res );
>     }
>     
>     my_i2cdev = cdev_alloc();
>     my_i2cdev->ops = &i2c_fops;
>     my_i2cdev->owner = THIS_MODULE;
>    
>     /* make device "alive" */ 
>     res = cdev_add( my_i2cdev, devt, 1 );
>     
>     if ( res < 0 )
>     { 
>         printk( KERN_INFO "i2cgvc: adding cdev failed.\n" );
>         return ( res );
>     }
> 
> Now, the moment the I2C driver gets initialised, it will obtain a free
> MAJOR number from the kernel.
> 
> 2. Creating the device node:
> 
> Since the MAJOR number is now dynamically defined, I can't create the
> device node for the i2c driver (/dev/i2c) dynamically gain.
> 
> Your proposal made me think about a system to keep the "/dev/i2c" as
> "user access point".
> After all, opening a device using "open( "/dev/i2c", O_RDWR )" is
> still far more better than using "open( "/etc/dev/i2c", O_RDWR )".
> One expects devices in the "/dev" directory and not in the "/etc/dev"
> directory.  Sounds more "intuitive" isn't it?
> 
> So, I made the following decision:
> 
> - Create the i2c device in "/etc/dev" (so, "/etc/dev/i2c").  This can
> be done dynamically, since it's not a read-only section (your input).
> 
> - Create a link "/dev/i2c" that points to "/etc/dev/i2c".  This can be
> done during the FB image build process, by doing the following changes
> in "/devboard-R2_01/packages/devices/axis-2.4-R1_0_10/Makefile": 
> 
> * Remove (or comment out) the following line:
> 
>  $(MKNOD) -m 0644           $(DEV)/i2c       c 123   0
> 
> * Add the following line:
> 
>  $(LN) -sf ../etc/dev/i2c   $(DEV)/i2c
> 
> This will statically create a link from "/dev/i2c" to the final
> location of the real i2c device node "/etc/dev/i2c".
> Because of that, we will be able to continue to use "/dev/i2c" in our
> code to access the device => reached my goal!
> 
> But now, how to get those things working?  See the next steps...
> 
> 3. Creating the node "/etc/dev/i2c".
> 
> What I've done, is creating a new subdirectory called "i2cdev_R1" into
> the directory "/devboard-R2_01/packages/initscripts".  I also added a
> link "i2cdev" that is pointing to "i2cdev_R1" (took the other files as
> an example).
> 
> Into the directory "i2cdev-R1", I added a Makefile and an rc file,
> with the following content:
> 
> - Makefile:
> 
> include $(AXIS_TOP_DIR)/tools/build/Rules.axis
> 
> OWN = -o root -g root
> 
> install:
>         $(INSTALL) $(OWN) -m 0755 rc $(prefix)/etc/init.d/i2cdev
>         $(LN) -sf ../init.d/i2cdev "$(prefix)"/etc/rcS.d/S30i2cdev
> 
> - rc file:
> 
> #! /bin/sh
> 
> . /etc/init.d/functions.sh
> 
> begin "Creating i2c dev node"
> information "Create dev node for the I2C device, based upon the dyn.
> allocated MAJOR number"
> information "Make /etc/dev directory..."
> mkdir /etc/dev
> information "Create device node..."
> mknod -m 0644 /etc/dev/i2c c $(awk '$2=="i2cgvc" {print $1}'
> /proc/devices)  0
> information "Done creating device node..."
> end $?
> 
> 5. Creation of the link "S30i2cdev".
> 
> Since I also wanted to have this script running automatically during
> boot time, I added a link called "S30i2cdev" into the subdirectory
> "/etc/init.d".  In fact, this is already done by the Makefile
> described in point 3. (see $(LN)....).
> 
> Like this, the "for" loop into "/etc/init.d/rc" is also taking the
> link "S30i2cdev" into account while booting up.
> This will result in running the script "i2cdev", located in
> "/etc/init.d" on the RFS.
> 
> That's more or less how it works.
> 
> I'm still missing 1 link:
> 
> I had to manually add the line "packages/initscripts/i2cdev \" into
> the main Makefile.
> The problem is, when I rerun ./configure, this line will be kicked out
> again and my script will not be taken into account any more...
> 
> Don't know how to solve this one yet, but I already submitted a
> question on this newsgroup for assistance.
> 
> Once I have this last item tackled, the circle is round and I have my
> new mechanism introduced.
> 
> If there are better approaches to do this, I'm certainly open for
> suggestions.
> 
> But by doing this, I learned a lot about the whole set-up of the
> complete system (although not everything is clear yet to me...).
> 
> Best rgds,
> 
> --Geert
>

Now the last obstacle is taken too!

Adding the line "packages/initscript/i2cdev" to the Makefile using
./configure to create that file, is now possible.

I had to add the following line to the file
"/devboard-R2_01/configure-files/common/common":

"sub packages/initscripts/i2cdev rev=R1".

Thanks to Jean-Pierre D'Hondt to trigger me.

Best rgds,

--Geert

Reply via email to