Help / Advice On Creating a Kernel Module

Yello,

I'm running a BF561 and what I'm basically trying to do is allow a Linux program on CoreA to read buffers that are being written to by a bare metal encoder running on CoreB. The buffers and varibles I need to be able to access have fixed memory locations in L3 and L2 Cache, the larger buffers and variables will be read on the Linux side, some of the others will need to be able to change bytes.

Now my main question is where or not it's possible to get the kernel process to pass to the Linux process a pointer so the linux process can read the buffer directly rather then have to copy the data. I know that the kernel module can directly address memory but I don't know how to then pass that to the Linux process. So can someone point me in the right direction, thanks

If it helps the bare metal process is a AD's H.264 encoder, and I need to be able to read the output NAL table and Stream buffer from linux, so they can be transmitted on to an end PC. I'm basically writting a mini ICC.

Kind Regards,

Nathan Skidmore

Parents
  • The ICC doesn't work with VirualDSP++ compiled programs because it  was compiled with the GNU toolchain, at least not without being edited  to crowbar it in, also the Analog Device H.264 encoder that's running on  CoreB can't be compiled in the GNU toolchain. So out of the box the two  are not compatible, also the ICC is over complicated for what we are  trying to achieve.

    Please answer the ORIGINAL question, not fixate on a  detail that I only added to explain what I was aiming for, its like you  ignore the large majority of my original post.

    All I want to be able to do is use a device drive /  kernel module to pass a pointer to a linux program that points to the  right area of memory for the buffer, I just need a small code slice to  confirm that it is posible or that my best guess is correct. The way I  was assuming it could be done was by using ioctl to return a pointer to a  variable in the kernel module that already points to the right area of  memory area, something to the effect of the code below, but having never  written a kernel module before, and none of the documentation talking  about directly addressing memory I need my assumptions confirmed.

    Kernel Module:

    static unsigned char *streambuffer = (unsigned char*)0x02200000;

    int encoder_icc_ioctl (struct inode *inode, struct file* filp, unsigned int cmd, unsigned long arg)
    {
         switch (cmd)
         {
             case (SOME_COMMAND):
             {

                return &streambuffer;
             }
         }
    }

    Linux Program:

    unsigned char **streambufferpointer = ioctl(...);

    Kind Regards,

    Nathan Skidmore

Reply
  • The ICC doesn't work with VirualDSP++ compiled programs because it  was compiled with the GNU toolchain, at least not without being edited  to crowbar it in, also the Analog Device H.264 encoder that's running on  CoreB can't be compiled in the GNU toolchain. So out of the box the two  are not compatible, also the ICC is over complicated for what we are  trying to achieve.

    Please answer the ORIGINAL question, not fixate on a  detail that I only added to explain what I was aiming for, its like you  ignore the large majority of my original post.

    All I want to be able to do is use a device drive /  kernel module to pass a pointer to a linux program that points to the  right area of memory for the buffer, I just need a small code slice to  confirm that it is posible or that my best guess is correct. The way I  was assuming it could be done was by using ioctl to return a pointer to a  variable in the kernel module that already points to the right area of  memory area, something to the effect of the code below, but having never  written a kernel module before, and none of the documentation talking  about directly addressing memory I need my assumptions confirmed.

    Kernel Module:

    static unsigned char *streambuffer = (unsigned char*)0x02200000;

    int encoder_icc_ioctl (struct inode *inode, struct file* filp, unsigned int cmd, unsigned long arg)
    {
         switch (cmd)
         {
             case (SOME_COMMAND):
             {

                return &streambuffer;
             }
         }
    }

    Linux Program:

    unsigned char **streambufferpointer = ioctl(...);

    Kind Regards,

    Nathan Skidmore

Children
No Data