Loading Documentation/DocBook/writing-an-alsa-driver.tmpl +17 −10 Original line number Diff line number Diff line Loading @@ -5518,34 +5518,41 @@ struct _snd_pcm_runtime { ]]> </programlisting> </informalexample> For the raw data, <structfield>size</structfield> field must be set properly. This specifies the maximum size of the proc file access. </para> <para> The callback is much more complicated than the text-file version. You need to use a low-level I/O functions such as The read/write callbacks of raw mode are more direct than the text mode. You need to use a low-level I/O functions such as <function>copy_from/to_user()</function> to transfer the data. <informalexample> <programlisting> <![CDATA[ static long my_file_io_read(struct snd_info_entry *entry, static ssize_t my_file_io_read(struct snd_info_entry *entry, void *file_private_data, struct file *file, char *buf, unsigned long count, unsigned long pos) size_t count, loff_t pos) { long size = count; if (pos + size > local_max_size) size = local_max_size - pos; if (copy_to_user(buf, local_data + pos, size)) if (copy_to_user(buf, local_data + pos, count)) return -EFAULT; return size; return count; } ]]> </programlisting> </informalexample> If the size of the info entry has been set up properly, <structfield>count</structfield> and <structfield>pos</structfield> are guaranteed to fit within 0 and the given size. You don't have to check the range in the callbacks unless any other condition is required. </para> </chapter> Loading Loading
Documentation/DocBook/writing-an-alsa-driver.tmpl +17 −10 Original line number Diff line number Diff line Loading @@ -5518,34 +5518,41 @@ struct _snd_pcm_runtime { ]]> </programlisting> </informalexample> For the raw data, <structfield>size</structfield> field must be set properly. This specifies the maximum size of the proc file access. </para> <para> The callback is much more complicated than the text-file version. You need to use a low-level I/O functions such as The read/write callbacks of raw mode are more direct than the text mode. You need to use a low-level I/O functions such as <function>copy_from/to_user()</function> to transfer the data. <informalexample> <programlisting> <![CDATA[ static long my_file_io_read(struct snd_info_entry *entry, static ssize_t my_file_io_read(struct snd_info_entry *entry, void *file_private_data, struct file *file, char *buf, unsigned long count, unsigned long pos) size_t count, loff_t pos) { long size = count; if (pos + size > local_max_size) size = local_max_size - pos; if (copy_to_user(buf, local_data + pos, size)) if (copy_to_user(buf, local_data + pos, count)) return -EFAULT; return size; return count; } ]]> </programlisting> </informalexample> If the size of the info entry has been set up properly, <structfield>count</structfield> and <structfield>pos</structfield> are guaranteed to fit within 0 and the given size. You don't have to check the range in the callbacks unless any other condition is required. </para> </chapter> Loading