Difference between revisions of "Ioctl"
m (Added category) |
|||
Line 60: | Line 60: | ||
Then good luck for debugging your driver... | Then good luck for debugging your driver... | ||
+ | |||
+ | [[Category:Embedded Dictionary]] |
Latest revision as of 23:51, 27 October 2011
Introduction
Sometimes some applications block, and strace show something like that:
ioctl(6, 0x400c4150
which means that the kernel blocks during that ioctl.
Howto
we will take the same example than before,with mplayer blocking.:
ioctl(6, 0x400c4150
there are two important information in it: 6 is the file descriptor,the corresponding file can be found with:
ls -l /proc/$(pidof mplayer)/fd/6
which gives
/dev/snd/pcmC0D0p
That correspond to alsa. Then we have the 0x400c4150 the important part is the last part: 41 is 0x41 which is often represented as a letter and can be decoded like this:
$ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import binascii >>> binascii.a2b_hex("41") 'A'
Or verified like this:
$ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import binascii >>> binascii.b2a_hex("A") '41'
Then 0x50 remains. we don't need to decode it,it's fine like it is.
so with A and 50 and /dev/snd/pcmC0D0p file we can go to grep in include/sound of the kernel sources:
include/sound$ grep "0x50" * ac97_codec.h:#define AC97_GPIO_STICKY 0x50 /* GPIO Pin Sticky, 0=not, 1=sticky */ ad1816a.h:#define AD1816A_SRC_MIC 0x50 ad1816a.h:#define AD1816A_SRC_MONO 0x50 asequencer.h:#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION _IOWR('S', 0x50, struct snd_seq_port_subscribe) asoundef.h:#define MIDI_CTL_GENERAL_PURPOSE5 0x50 asound.h:#define SNDRV_PCM_IOCTL_WRITEI_FRAMES _IOW('A', 0x50, struct snd_xferi) cs46xx.h:#define HDCR_SMS_256_DWORDS 0x50000000 cs46xx.h:#define DMA_RQ_C1_SOURCE_MOD256 0x50000000 emu10k1.h:#define CDCS 0x50 /* CD-ROM digital channel status register */ emu10k1.h:#define C_ffffffff 0x50 emu10k1.h:#define A_P16VIN(x) (0x50 + (x)) /* x = 0x00 - 0x0f p16v ins (A2 only) "EMU32 inputs" */ gus.h:#define SNDRV_GF1_GB_DRAM_DMA_HIGH 0x50 sb.h:#define SB_ALS4000_3D_SND_FX 0x50 trident.h:#define SI_ASR0 0x50
here we see:
asound.h:#define SNDRV_PCM_IOCTL_WRITEI_FRAMES _IOW('A', 0x50, struct snd_xferi)
which is our ioctl.
The next step is to look where this ioctl is called:
sound$ grep SNDRV_PCM_IOCTL_WRITEI_FRAMES -r * core/pcm_native.c: case SNDRV_PCM_IOCTL_WRITEI_FRAMES: core/pcm_compat.c: SNDRV_PCM_IOCTL_WRITEI_FRAMES32 = _IOW('A', 0x50, struct snd_xferi32), core/pcm_compat.c: case SNDRV_PCM_IOCTL_WRITEI_FRAMES32:
Then good luck for debugging your driver...