element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      • Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Raspberry Pi
  • Products
  • More
Raspberry Pi
Raspberry Pi Forum Driver fixes and updates to kernel 3.18.16 and 4.0.5
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Raspberry Pi to participate - click to join for free!
Featured Articles
Announcing Pi
Technical Specifications
Raspberry Pi FAQs
Win a Pi
Raspberry Pi Wishlist
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • Replies 180 replies
  • Subscribers 689 subscribers
  • Views 23074 views
  • Users 0 members are here
  • raspberry_pi
  • raspeberry_pi_accessories
Related

Driver fixes and updates to kernel 3.18.16 and 4.0.5

hiassoft
hiassoft over 10 years ago

Edit: Current kernel versions and install/config instructions are also available from my webpage http://www.horus.com/~hias/cirrus-driver.html

 

During the last few weeks I fixed various issues in the Wolfson/Cirrus driver and rebased it so it works with the current RPi kernel versions (3.18.16 and 4.0.5).

 

You can download the patches from my GitHub repository. The 3.18 kernel with Cirrus drivers is in the cirrus-3.18.y branch, the 4.0 kernel with Cirrus drivers is in the cirrus-4.0.y branch. I'll rebase and update these branches from time to time so that the Cirrus driver and my changes will stay on top of the commit list.

 

If you just want to have an updated 3.18.16 kernel you can download precompiled binaries from here. Just unpack the tarball in the root directory. Before you do that it might be a good idea to update the firmware files (bootcode.bin, start*.elf and fixup*.dat in the boot directory) to the latest version.

 

Here's a list of my changes:

- Added the FLL1 setup back so that switching between 44.1kHz and 48kHz (and other sample rates) works fine.

- Don't register Arizona IRQ if it's set to 0. The Cirrus driver uses polling here and if we register an interrupt handler for irq 0 we get lots of "spurious interrupt" messages spamming dmesg in kernel 3.19 and newer. IRQ 0 is wrong anyway.

- Include DCVDD patches from the Cirrus linux-drivers repository. These patches make sure the WM8804 chip is initialized properly. Without this patch I sometimes had SPDIF audio out only on the right channel.

- Disable spidev0 in Cirrus device tree overlay. That's mainly a safety precaution so that userspace programs trying to access spi0.0 won't interfere with the WM8804 reset line. I'm not 100% sure this is needed at all, so maybe I'll remove it some time later.

 

And some important notes:

I haven't included the mmap patch, this is already supported in the upstream kernels but currently disabled by default. To enable mmap support add the following line to config.txt:

dtoverlay=i2s-mmap

 

If you compile the kernel on your own please note that the devicetree overlays have now been moved to arch/arm/boot/dts/overlays.

 

Kernel 4.0 now uses spi_bcm2835 by default (the older spi_bcm2708 module is available via a devicetree overlay) so you have to extend your /etc/modprobe.d conf file and add a pre-depend for spi_bcm2835 as well. It's safe to have both the old and the new module in here, so just use this configuration:

softdep arizona-spi pre: arizona-ldo1
softdep spi-bcm2708 pre: fixed
softdep spi-bcm2835 pre: fixed

 

so long,

 

Hias

  • Sign in to reply
  • Cancel
Parents
  • Former Member
    Former Member over 10 years ago

    Hi Hias,

     

    This is a little bit off topic, but I am now trying to access the registers on the WM5102 so that I can use the cirrus logic card as a real time audio processing box (takes input from line in, processes audio in C, passes output through line out). I am trying to do it using i2c with the help of wiring pi. Here is the code I have as well as the output when running it. Is there something additional that I have to do to get i2c working with the cirrus card that I am missing?

     

    #include <stdio.h>

    #include <wiringPiI2C.h>

     

    int main()

    {

       int fd = wiringPiI2CSetup(26);

       int test1 = wiringPiI2CReadReg8(fd,768);

       int test2 = wiringPiI2CWriteReg8(fd,768,16);

       int test3 = wiringPiI2CReadReg8(fd,768);

       printf("fd = %i, test1 = %i, test2 = %i, test3 = %i\n", fd, test1, test2, test3);

       return 0;

    }

     

    it prints: "fd = 3, test1 = 0, test2 = 0 test3 = 0"

     

    Thanks for any help,


    Ryan

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • hiassoft
    hiassoft over 10 years ago in reply to Former Member

    Hi Ryan!

    This is a little bit off topic, but I am now trying to access the registers on the WM5102 so that I can use the cirrus logic card as a real time audio processing box (takes input from line in, processes audio in C, passes output through line out). I am trying to do it using i2c with the help of wiring pi. Here is the code I have as well as the output when running it. Is there something additional that I have to do to get i2c working with the cirrus card that I am missing?

    So far I didn't have much luch talking to the wm5102 via I2C. I tried it with the standard /dev/i2c interface (I2C_RDWR ioctl, 32 bits register address and 16 bit data).

     

    Changing the devicetree overlay and hooking up the wm5102 to i2c address 0x1a didn't work either, it detected the wm5102 via I2C but couldn't apply the hardware patch. I2C reads from the wm5102 always seem to return 0x5102. Not sure what's going on here, maybe I missed something.

     

    Even if I2C access in parallel to SPI access would work it would mess things up with the kernel driver. It uses the regmap/regcache layer and if that's out of sync with the real register values (changed behind it's back via I2C) that could lead to interesting results...

     

    The question is: what do you want to do and do you really have to access the chip-registers directly? Most of the chip's internal registers are exposed via alsa mixer controls and for standard realtime processing you should be fine using the userspace alsa interface.

     

    so long,

     

    Hias

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 10 years ago in reply to hiassoft

    Hi Hias,

     

    Okay, I don't have much experience using alsa. I am working on a reverberation effect to be used with guitar. I need to take the guitar signal from line input one sample at a time, put it through some C code that I have already finished, and then put the new sample back out of line out. Will that be possible using alsa? Also I'll probably want to change the sampling rate and bps. If it is possible, will I be using alsa outside of the C program I have written?

     

    Thanks again,

     

    Ryan

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • Former Member
    Former Member over 10 years ago in reply to hiassoft

    Hi Hias,

     

    Okay, I don't have much experience using alsa. I am working on a reverberation effect to be used with guitar. I need to take the guitar signal from line input one sample at a time, put it through some C code that I have already finished, and then put the new sample back out of line out. Will that be possible using alsa? Also I'll probably want to change the sampling rate and bps. If it is possible, will I be using alsa outside of the C program I have written?

     

    Thanks again,

     

    Ryan

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Children
  • hiassoft
    hiassoft over 10 years ago in reply to Former Member

    Hi Ryan!

    Okay, I don't have much experience using alsa. I am working on a reverberation effect to be used with guitar. I need to take the guitar signal from line input one sample at a time, put it through some C code that I have already finished, and then put the new sample back out of line out. Will that be possible using alsa? Also I'll probably want to change the sampling rate and bps. If it is possible, will I be using alsa outside of the C program I have written?

    That depends on your program image

     

    Using alsa (as it's the native linux audio layer) is just one of the possiblities. Some people prefer using jack (which then interfaces to alsa) and there are even very high level applications like PD (pure data) that allow you to create realtime effects.

     

    Just do some googling and choose the solution that meets your requirements best.

     

    so long,

     

    Hias

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2026 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube