[{"content":"Last week marks the Mesa 26.1 branch point, and I wanted to take a moment to look back at what happened on the PanVK front.\nSpoiler: it was a busy one.\nThe landscape PanVK - the Vulkan driver for Arm Mali GPUs (Valhall and newer) - is a collaborative effort. Collabora has been doing incredible work on the compiler backend and the foundational infrastructure. Arm themselves are actively contributing to the open source Mali GPU stack as well, reviewing patches and pushing driver quality forward. On the Igalia side, my focus this cycle was Vulkan extension coverage. The kind of work that doesn\u0026rsquo;t make for flashy demos but is absolutely critical for real-world application compatibility - especially for things like DXVK.\nWhy extensions matter A Vulkan driver without extensions is like a car without wheels - technically complete, practically useless. Applications (and translation layers like DXVK, vkd3d-proton, and Zink) probe for specific extensions and adjust their behavior accordingly. Missing even one can mean falling back to a slower path or refusing to run entirely.\nThree different things drove the extension work this cycle:\nThe Proton stack - extensions consumed by DXVK and vkd3d-proton, the translation layers that make D3D9–12 games run on Vulkan. DDK feature parity - extensions Arm\u0026rsquo;s binary Mali driver exposes that PanVK didn\u0026rsquo;t yet, tracked in the DDK feature parity ticket. Catching up on mesamatrix.net - closing the visible gap with the other Mesa Vulkan drivers (RADV, ANV, Turnip). So I set out to close gaps. Lots of them.\nThe Proton stack essentials These are extensions DXVK and vkd3d-proton actually require - not just nice-to-haves on a recommendation list. Each one unblocks something concrete in the D3D-to-Vulkan translation path.\nVK_EXT_conditional_rendering (!40452) was probably the most involved piece of work. D3D12 has predicated rendering (SetPredication), and vkd3d-proton uses this extension to implement it efficiently. It wasn\u0026rsquo;t a simple \u0026ldquo;flip a bit\u0026rdquo; situation - I had to add the core state tracking, wrap all draw and dispatch calls with conditional checks, handle inherited state in secondary command buffers, and make sure meta operations (like internal clears and resolves) properly disable conditional rendering so they don\u0026rsquo;t get accidentally skipped. That ended up being five patches touching draw paths, dispatch, and the secondary command buffer inheritance logic.\nVK_VALVE_mutable_descriptor_type (!40254) is one of those extensions that exists purely because Valve needed it. In D3D, descriptor types are more fluid than in Vulkan - a descriptor slot might hold a sampler one frame and a storage buffer the next. vkd3d-proton enables this to avoid expensive descriptor set re-creation when types change. It\u0026rsquo;s a trivial alias of the already-supported VK_EXT_mutable_descriptor_type, so enabling it was a one-liner.\nVK_EXT_memory_budget (!40246) lets applications (and both DXVK and vkd3d-proton) query how much GPU memory is actually available versus how much is in use. Without it, apps are flying blind on memory management, which can lead to over-allocation and stuttering. Getting the heap budget reporting right required hooking into the kernel memory accounting. (LF maybe change this to \u0026ldquo;required hooking into the kernel driver\u0026rsquo;s memory accounting function\u0026rdquo;)\nVK_EXT_attachment_feedback_loop_layout (!40498) - feedback loops let you read from an attachment that you\u0026rsquo;re simultaneously rendering to (think screen-space effects that sample the current framebuffer). DXVK uses this in its D3D9 hazard layout path to avoid artifacts in certain games.\nVK_EXT_shader_stencil_export (!39944) - allows fragment shaders to write stencil values directly, rather than relying on the fixed-function stencil path. DXVK leans on this in its meta-copy and meta-resolve paths, and vkd3d-proton enables it too. The Panfrost stack already supported everything needed; literally a one-line advertisement in physical_device.c.\nVK_KHR_shader_untyped_pointers (!40457, v9+) - a newer KHR extension that relaxes pointer type requirements in SPIR-V. DXVK calls this out as a dependency for descriptor heaps. Restricted to v9+ because Bifrost has issues with 8-bit vector loads through untyped pointers combined with 16-bit storage. Also needed to lower memcpy derefs before explicit IO lowering.\nCatching up to the DDK The panfrost keeps a DDK feature parity ticket tracking everything Arm\u0026rsquo;s binary Mali driver exposes that PanVK doesn\u0026rsquo;t yet. Four of those got crossed off this cycle:\nVK_ARM_scheduling_controls (!40063, CSF only) - an ARM-specific extension for controlling shader core scheduling on Command Stream Frontend (CSF) hardware. I also fixed the per-queue shader core count so CSF group creation uses the right values. VK_EXT_legacy_dithering (!39781) - implements ordered dithering in the blending stage, which some applications expect from legacy APIs. Wired up the existing Panfrost dithering infrastructure (pan_dithered_format_from_pipe_format()) — just plumbing the VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT flag through the blend descriptor and color attachment internal conversion paths. VK_EXT_rgba10x6_formats (!40653) - a last-minute addition that just squeezed in before the branch point. This required adding the PIPE_FORMAT_X6R10X6G10X6B10X6A10_UNORM format to Mesa\u0026rsquo;s gallium format table first, then wiring it up in PanVK. Used for 10-bit per channel content in video and HDR scenarios. VK_EXT_astc_decode_mode (!39799) - controls the format used when decoding ASTC compressed textures, allowing apps to choose lower-precision decoding for performance. The Panfrost hardware already supports controlling ASTC decode precision via the Decode Wide plane descriptor field; just needed to parse VkImageViewASTCDecodeModeEXT from the image view pNext chain and set astc.narrow accordingly. v9+ only because the relevant ASTC plane descriptor fields only exist from Valhall onward. Catching up on mesamatrix mesamatrix.net tracks Vulkan extension support across the Mesa drivers. The remaining extensions this cycle were about closing the visible gap with RADV, ANV, and Turnip — extensions that don\u0026rsquo;t have a single big consumer driving them, but whose absence shows up as red squares on the matrix and as silent fallbacks in apps that probe for them.\nVK_EXT_color_write_enable (!39913) - per-attachment control over which color channels actually get written. The common Vulkan runtime already handled all the pipeline state and dynamic command plumbing, and panvk\u0026rsquo;s blend descriptor emission was already consuming color_write_enables, so this was effectively an \u0026ldquo;advertise the feature\u0026rdquo; change. VK_EXT_depth_clamp_control (!39925) - lets applications specify a custom depth clamp range instead of always clamping to the viewport\u0026rsquo;s minDepth/maxDepth. Mali GPUs have native LOW_DEPTH_CLAMP/HIGH_DEPTH_CLAMP registers, so it was a matter of wiring the existing runtime state through to those. VK_EXT_attachment_feedback_loop_dynamic_state (!40498) - the dynamic-state companion to VK_EXT_attachment_feedback_loop_layout above; lets you toggle feedback-loop state per draw call without pipeline rebuilds. VK_EXT_map_memory_placed (!40315) - lets applications control where in their virtual address space GPU memory gets mapped. This simplified pan_kmod_bo_mmap() to always map the whole BO, cleaning up the kernel module interface. VK_EXT_shader_atomic_float (!40506) - atomic operations on float values in shaders. The existing axchg instruction is type-agnostic, so no compiler changes were needed; image atomics are already lowered to global atomics. Just had to add R32_FLOAT to the storage-image-atomic format flag. VK_EXT_nested_command_buffer (!40120, v10+) - allows secondary command buffers to call other secondary command buffers. The CSF backend\u0026rsquo;s cs_call() is a hardware call/return instruction that nests naturally, and the existing CmdExecuteCommands already does the caller/callee state merging. The 8-level hardware call stack, minus one for the kernel ringbuffer call and two reserved for future driver use, leaves maxCommandBufferNestingLevel at 5. VK_EXT_image_view_min_lod (!39938) - allows clamping the minimum LOD at the image view level rather than just the sampler. Mali v6+ has per-texture-descriptor LOD clamp fields independent from the sampler\u0026rsquo;s, so this just plumbs vk_image_view::min_lod through pan_image_view into the texture descriptor — no shader lowering or descriptor merging needed. VK_EXT_zero_initialize_device_memory (!39658) - guarantees that newly allocated device memory is zeroed. The kernel side already does the heavy lifting — panfrost/panthor use drm_gem_shmem, which serves zeroed pages from the shmem subsystem. And since panvk treats layout transitions as no-ops, VK_IMAGE_LAYOUT_ZERO_INITIALIZED_EXT falls out for free. (Did need one format-table fix: dropping STORAGE_IMAGE support from compressed formats to avoid crashes in the new dEQP tests.) By the numbers That\u0026rsquo;s 18 extensions across roughly a dozen merge requests - ranging from single-patch additions to multi-patch series like conditional rendering. Collectively they represent a meaningful shift in what PanVK can claim to support: more of the Proton stack working out of the box, four more checkboxes against the DDK, and fewer red squares on the mesamatrix.\nWhat\u0026rsquo;s next The extension sprint isn\u0026rsquo;t over - there are still gaps to fill, and each one removed makes PanVK more viable for real workloads. But 26.1 was a good milestone. The driver is getting to the point where you can throw a DXVK game at it and have a reasonable expectation that it just works.\nBack to it. ⚡\n","permalink":"https://playground.christian-gmeiner.info/2026-04-20-panvk-extensions/","summary":"\u003cp\u003eLast week marks the Mesa 26.1 branch point, and I wanted to take a moment to look back at what happened on the PanVK front.\u003c/p\u003e\n\u003cp\u003eSpoiler: it was a busy one.\u003c/p\u003e\n\u003ch3 id=\"the-landscape\"\u003eThe landscape\u003c/h3\u003e\n\u003cp\u003ePanVK - the Vulkan driver for Arm Mali GPUs (Valhall and newer) - is a collaborative effort. \u003ca href=\"https://www.collabora.com/\"\u003eCollabora\u003c/a\u003e has been doing incredible work on the compiler backend and the foundational infrastructure. \u003ca href=\"https://www.arm.com/\"\u003eArm\u003c/a\u003e themselves are actively contributing to the open source Mali GPU stack as well, reviewing patches and pushing driver quality forward. On the \u003ca href=\"https://www.igalia.com/\"\u003eIgalia\u003c/a\u003e side, my focus this cycle was \u003cstrong\u003eVulkan extension coverage\u003c/strong\u003e. The kind of work that doesn\u0026rsquo;t make for flashy demos but is absolutely critical for real-world application compatibility - especially for things like \u003ca href=\"https://github.com/doitsujin/dxvk\"\u003eDXVK\u003c/a\u003e.\u003c/p\u003e","title":"PanVK Extension Sprint: Mesa 26.1"},{"content":"This is the start of a series about getting OpenGL ES 3.0 conformance on Vivante GC7000 hardware using the open-source etnaviv driver in Mesa. Thanks to Igalia for giving me the opportunity to spend some time on these topics.\nWhere We Are etnaviv has supported GLES2 on Vivante GPUs for a long time. GLES3 support has been progressing steadily, but the remaining dEQP failures are the stubborn ones - the cases where the hardware doesn\u0026rsquo;t quite do what the spec says, and the driver has to get creative.\nThese aren\u0026rsquo;t missing feature bits or unimplemented extensions. These are the problems where you stare at a command stream trace from the proprietary blob driver and realize they\u0026rsquo;re doing something completely different from what you\u0026rsquo;d expect, because the hardware has a quirk that nobody documented.\nThe Approach My workflow for each fix follows a pattern:\nRun the failing dEQP test, note the failure mode (wrong pixels, crash, GPU hang) Capture command stream traces from both the blob (proprietary driver) and etnaviv for the same test Compare the traces - what states differ? What draw calls differ? Is the blob doing extra work? Understand why - read the spec, reason about the hardware behavior, figure out what the blob knows that we don\u0026rsquo;t Implement the fix in Mesa, test, iterate The blob traces are invaluable. Vivante\u0026rsquo;s proprietary driver has years of hardware workarounds baked in. When something doesn\u0026rsquo;t work, the answer is usually hiding in the trace.\nThe Hardware The primary test target is a GC7000 rev 6214 (HALTI5 generation). This is a capable GPU found in the NXP i.MX8MQ SoC. It has a BLT engine, texture descriptors, and most of the features needed for GLES3 - but also its own set of rasterization quirks and interpolation behaviors that need workarounds.\nIn the future, I plan to expand the focus to the broader GC7000 GPU family.\nUp Next The first post will tackle the R/B swap problem - the PE always writes pixels in BGRA byte order, and we\u0026rsquo;ve been fixing it in the shader. The blob has a simpler answer. Stay tuned.\nFollowing Along All of this work happens upstream in Mesa.\nIf you\u0026rsquo;re interested in GPU driver development, these posts aim to show what the work actually looks like \u0026ndash; not just the final patch, but the debugging, the trace analysis, and the reasoning that gets you there.\n","permalink":"https://playground.christian-gmeiner.info/2026-02-20-gles3-on-etnaviv-fixing-the-hard-parts/","summary":"\u003cp\u003eThis is the start of a series about getting OpenGL ES 3.0 conformance on Vivante GC7000 hardware using the open-source etnaviv driver in Mesa. Thanks to \u003ca href=\"https://www.igalia.com/\"\u003eIgalia\u003c/a\u003e for giving me the opportunity to spend some time on these topics.\u003c/p\u003e\n\u003ch2 id=\"where-we-are\"\u003eWhere We Are\u003c/h2\u003e\n\u003cp\u003eetnaviv has supported GLES2 on Vivante GPUs for a long time. GLES3 support has been progressing steadily, but the remaining dEQP failures are the stubborn ones - the cases where the hardware doesn\u0026rsquo;t quite do what the spec says, and the driver has to get creative.\u003c/p\u003e","title":"GLES3 on etnaviv: Fixing the Hard Parts"},{"content":"After years of working on etnaviv - a Gallium/OpenGL driver for Vivante GPUs - I\u0026rsquo;ve been wanting to get into Vulkan. As part of my work at Igalia, the goal was to bring VK_EXT_blend_operation_advanced to lavapipe. But rather than going straight there, I started with Honeykrisp - the Vulkan driver for Apple Silicon - as a first target: a real hardware driver to validate the implementation against before wiring it up in a software renderer. My first Vulkan extension, and my first real contribution to Honeykrisp.\nWhy this extension? A customer needed advanced blending support in lavapipe, so the extension choice was made for me. But it turned out to be a great fit for a first extension - useful, self-contained, and not a multi-month rabbit hole. Standard Vulkan blending is limited to basic operations like add and subtract with blend factors. That\u0026rsquo;s fine for most rendering, but if you want Photoshop-style effects - multiply, screen, overlay, color dodge, color burn - you\u0026rsquo;re stuck doing it manually in shaders or with extra render passes.\nThe extension adds 19 blend operations that handle all of this in the fixed-function pipeline. Useful for UI toolkits, image editors, and anywhere you need creative compositing.\nThe journey What started as \u0026ldquo;just wire up an extension\u0026rdquo; turned into a proper refactoring adventure. The existing blend infrastructure in Mesa was scattered - OpenGL had its own enum definitions, Vulkan had separate conversions, and the actual NIR blend math lived in glsl-specific code.\nSo I took a step back and cleaned things up. Moved the blend mode enums into a shared util/blend.h header. Added proper helpers in the Vulkan runtime for converting between API types. Then came the fun part: implementing the actual blend equations in nir/lower_blend.\nEach of those 19 blend modes has its own formula from the spec. Some are simple (multiply is just src * dst), others get hairy with conditionals and special cases for luminosity and saturation. About 570 lines of NIR code later, I had a lowering pass that any Mesa driver can use.\nFor example, here\u0026rsquo;s how the spec defines advanced blending. Each mode plugs into a general equation:\nRGB = f(Cs,Cd) * X * p0 + Cs * Y * p1 + Cd * Z * p2 A = X * p0 + Y * p1 + Z * p2 Where p0, p1, p2 are weighting factors based on source/destination alpha coverage, and f(Cs,Cd) is the per-mode blend function. For overlay - probably the most recognizable blend mode from Photoshop - the spec defines:\nf(Cs,Cd) = 2*Cs*Cd, if Cd \u0026lt;= 0.5 1 - 2*(1-Cs)*(1-Cd), otherwise And here\u0026rsquo;s that same formula expressed as NIR - Mesa\u0026rsquo;s intermediate representation:\nstatic inline nir_def * blend_overlay(nir_builder *b, nir_def *src, nir_def *dst) { /* f(Cs,Cd) = 2*Cs*Cd, if Cd \u0026lt;= 0.5 * 1-2*(1-Cs)*(1-Cd), otherwise */ nir_def *rule_1 = nir_fmul(b, nir_fmul(b, src, dst), imm3(b, 2.0)); nir_def *rule_2 = nir_fsub(b, imm3(b, 1.0), nir_fmul(b, nir_fmul(b, nir_fsub(b, imm3(b, 1.0), src), nir_fsub(b, imm3(b, 1.0), dst)), imm3(b, 2.0))); return nir_bcsel(b, nir_fge(b, imm3(b, 0.5f), dst), rule_1, rule_2); } nir_fmul, nir_fsub, nir_bcsel - multiply, subtract, conditional select. Each call builds a node in the shader\u0026rsquo;s IR graph. This is what \u0026ldquo;lowering\u0026rdquo; looks like: translating a high-level blend mode into operations the GPU\u0026rsquo;s shader core can execute. The outer framework - the p0/p1/p2 weighting - is handled by the caller; each blend function just implements its f(Cs,Cd).\nThe Turnip surprise Everything was working on Honeykrisp, tests were passing, life was good. Then the merge pipeline started failing - on Turnip (the Adreno Vulkan driver). Not my code, not my hardware, but my changes were breaking it.\nI reached out for help, and Zan Dobersek stepped up. After some digging, he found the culprit: I was violating a subtle corner of the spec around attachmentCount. Turns out, when certain dynamic states are set and advancedBlendCoherentOperations isn\u0026rsquo;t enabled, attachmentCount gets ignored entirely. My state tracking code wasn\u0026rsquo;t accounting for that.\nOne fixup commit later, Turnip was happy again. This is the part they don\u0026rsquo;t tell you about Vulkan extensions - you\u0026rsquo;re not just implementing for your driver, you\u0026rsquo;re touching shared infrastructure that every driver depends on. And the Mesa CI will absolutely let you know if you break something.\nlavapipe landed One week later, lavapipe has it too. This was the original goal, and the shared infrastructure did exactly what it was supposed to - the lavapipe MR is mostly just flipping the extension on. The lowering pass, the enum plumbing, the runtime helpers - all reused as-is. The full dEQP-VK.pipeline.*.blend_operation_advanced.* test suite passes on both drivers.\nTwo drivers in two weeks. That\u0026rsquo;s what building the right abstractions gets you.\nWhat\u0026rsquo;s next The shared NIR lowering pass is there for any Mesa Vulkan driver to use. If your hardware doesn\u0026rsquo;t have native advanced blending support, enabling the extension is now mostly plumbing. I\u0026rsquo;m curious to see if other drivers pick it up.\nFor me, this was a good first step into Vulkan - and into working on Honeykrisp. I\u0026rsquo;m looking forward to what comes next.\nThe Honeykrisp/NIR MR and the lavapipe MR are both merged if you want to look at the code. Thanks to Alyssa Rosenzweig for the review and guidance, and to Zan Dobersek for debugging the Turnip regression with me.\n","permalink":"https://playground.christian-gmeiner.info/2026-02-13-my-first-vulkan-extension/","summary":"\u003cp\u003eAfter years of working on etnaviv - a Gallium/OpenGL driver for Vivante GPUs - I\u0026rsquo;ve been wanting to get into Vulkan. As part of my work at \u003ca href=\"https://www.igalia.com/\"\u003eIgalia\u003c/a\u003e, the goal was to bring \u003ca href=\"https://docs.vulkan.org/refpages/latest/refpages/source/VK_EXT_blend_operation_advanced.html\"\u003e\u003ccode\u003eVK_EXT_blend_operation_advanced\u003c/code\u003e\u003c/a\u003e to lavapipe. But rather than going straight there, I started with Honeykrisp - the Vulkan driver for Apple Silicon - as a first target: a real hardware driver to validate the implementation against before wiring it up in a software renderer. My first Vulkan extension, and my first real contribution to Honeykrisp.\u003c/p\u003e","title":"My first Vulkan extension"},{"content":"Modern graphics programming revolves around achieving high-performance rendering and visually stunning effects. Among OpenGL’s capabilities, Multiple Render Targets (MRTs) are particularly valuable for enabling advanced rendering techniques with greater efficiency.\nWith the latest release of Mesa 24.03 and the commitment from Igalia, the etnaviv GPU driver now includes support for MRTs. If you’ve ever wondered how MRTs can transform your graphics pipeline or are curious about the challenges of implementing this feature, this blog post is for you.\nUnderstanding Multiple Render Targets (MRTs) At its core, MRTs allow rendering to multiple images or \u0026ldquo;render targets\u0026rdquo; simultaneously during a single rendering pass. These render targets are buffers or textures that store various scene data such as color, depth, or normals. By writing to multiple targets at once, MRTs enable developers to:\nEnhance efficiency by reducing the number of rendering passes. Implement sophisticated rendering techniques, such as deferred shading, which decouples geometry processing from lighting and shading. Here’s a simple OpenGLES shader example demonstrating how to use MRTs:\n// Vertex Shader layout(location = 0) in vec2 inPosition; void main() { gl_Position = vec4(inPosition, 0.0, 1.0); } // Fragment Shader layout(location = 0) out vec4 fragColor1; layout(location = 1) out vec4 fragColor2; void main() { fragColor1 = vec4(1.0, 0.0, 0.0, 1.0); // Red fragColor2 = vec4(0.0, 0.0, 1.0, 1.0); // Blue } This code renders two render targets: one red and one blue, by declaring two output locations in the fragment shader and writing different colors to each of them.\nHow MRTs Are Used MRTs play an important role in graphics applications. Here are some of their most common use cases:\n1. Deferred Rendering MRTs are the backbone of deferred shading, a technique where scene geometry is rendered to multiple targets, storing data like positions, normals, and albedo. This data is then processed in a second pass to calculate lighting, enabling advanced effects like dynamic shadows and screen-space reflections.\n2. Post-Processing Effects By writing intermediate results to multiple targets, MRTs facilitate a wide range of effects, including bloom, depth of field, and ambient occlusion.\n3. Debugging and Visualization Developers can output different types of scene data simultaneously for debugging or creating visualizations.\nImplementing MRTs in etnaviv Adding MRT support to the etnaviv driver involved significant reverse engineering and experimentation. Here’s a look at some of the challenges and solutions:\nReverse Engineering the GPU The reverse engineering process begins with examining the limits exposed by the binary blob driver, such as the value returned by GL_MAX_DRAW_BUFFERS. Different Vivante GPU generations (HALTI) support varying numbers of render targets, requiring repeated testing and analysis.\nLay the foundation I started with Freedreno’s test-mrt-fbo to get a rought idea of what needed to be done. Hours later, I identified most of the necessary bits and GPU states I had seen in the command stream dumps generated by the proprietary driver.\nThe first goal was to get a very basic piglit MRT test working on the GC7000 (HALTI5) GPU, rendering correctly with etnaviv. In this phase of reverse engineering, I usually hack around in the driver and my git commit history is full of \u0026lsquo;hack/wip\u0026rsquo; commits. This helps me keep track of the (breaking) changes I make during the process.\nLooking at the changes I had made until here, it was clear that I had touched nearly every part of the gallium driver. It started with compiler changes to handle the extra color outputs and ended with the extra MRT states that needed to be emitted. And, to be honest, at this stage I also had broken some other CTS and piglit tests, but that was something to be taken care of later.\nWhen I tried some more complex piglit tests that used sparse render targets, I saw that they failed and realized, after reverse-engineering the proprietary driver some more, that I needed to work on remapping some information provided by NIR in Mesa about fragment shader outputs into compressed info the driver needed. That didn\u0026rsquo;t make all relevant Piglit tests pass, but I was getting close.\nWill it work on another GPU? The branch was then tested on older Vivante GPUs, like the GC3000 (HALTI2). None of the tests passed initially, as state emissions differed and the maximum MRT count was lower (4 vs. 8). Updating the state emission logic addressed these issues.\nWhats wrong with the Tile Status? As I always want to provide the best experience for all etnaviv users, I wanted to support this shiny new feature even on a much older Vivante GPU generation - GC2000 (HALT0) found in i.MX6 boards.\nMy hopes where high that my git branch would just work but, as usual, I was wrong. The traces from the vendor driver showed something interesting. There was no tile status (TS) usage found in the traces and I could confirm piglit was happy when I used ETNA_MESA_DEBUG=no_ts.\nYou might wonder that the ominous Tile Status might be. Let me give you a quick summary.\nA render target is divided in tiles, and every tile has a couple of status flags. An auxiliary buffer - the so called Tile Status buffer - associated with each render surface keeps track of these tile status flags. One of these flags is the clear flag, that signifies that the tile has been cleared. For example, a fast clear happens by setting the clear bit for each tile instead of clearing the actual surface data.\nI found a way to fix this problem too and then moved to CI.\nCI to test them all If you\u0026rsquo;ve followed me until here, you know that I worked on one HALTI and moved to another and never tested if I had broken any of the other HALTI\u0026rsquo;s. It was time to let etnaviv\u0026rsquo;s CI do its work and, as expected, I discovered I had broken HALTI5. After a local debugging session I got it into a working state. While I was very close to being ready to submit an MR and incorporate review feedback, there was one last thing I need to take care of\u0026hellip;\nHALTI5+ Enhancements for MRTs It turns out that a HALTI5 GPU can support more OpenGL extensions as it has even more GPU states that fall under the MRT umbrella. The MRT ground work that was already in place allowed me to implement the following ones:\n1. GL_EXT_draw_buffers2 This extension allows independent blending and write masking for each render target in an MRT setup. Developers can specify unique blending equations and masks for each target, offering unparalleled control over how data is combined.\n2. GL_ARB_draw_buffers_blend This feature extends blending capabilities even further, enabling per-buffer blending equations and functions. It’s especially useful for advanced rendering pipelines, such as deferred shading and post-processing, where different render targets may require entirely distinct blending behaviors.\nConclusion With the addition of MRT support and the powerful HALTI5+ enhancements like GL_EXT_draw_buffers2 and GL_ARB_draw_buffers_blend, the etnaviv driver has reached a significant milestone.\nMRT support is also a key feature for achieving full GLES3 compliance, marking a step forward in modernizing the capabilities of the etnaviv driver.\nFor detailed reverse engineering results, check out this repository, which uses the rnndb format to describe GPU states and bits. The MRT specific changes can be found in this commit.\nWhat’s next? Stay tuned for more updates on the etnaviv driver as we continue to push more features upstream.\n","permalink":"https://playground.christian-gmeiner.info/2025-01-16-mrt/","summary":"\u003cp\u003eModern graphics programming revolves around achieving high-performance rendering and visually stunning effects. Among OpenGL’s capabilities, Multiple Render Targets (MRTs) are particularly valuable for enabling advanced rendering techniques with greater efficiency.\u003c/p\u003e\n\u003cp\u003eWith the latest release of \u003ca href=\"https://docs.mesa3d.org/relnotes/24.3.0.html\"\u003eMesa 24.03\u003c/a\u003e and the commitment from \u003ca href=\"https://www.igalia.com/\"\u003eIgalia\u003c/a\u003e, the etnaviv GPU driver now includes support for MRTs. If you’ve ever wondered how MRTs can transform your graphics pipeline or are curious about the challenges of implementing this feature, this blog post is for you.\u003c/p\u003e","title":"Multiple Render Targets for etnaviv"},{"content":"I\u0026rsquo;m a big supporter of finding problems before they get into the code base. The earlier you catch issues, the easier they are to fix. One of the main tools that helps with this is a Continuous Integration (CI) farm. A CI farm allows you to run extensive tests like deqp or piglit on a merge request or even on a private git branch before any code is merged, which significantly helps catch problems early.\nI\u0026rsquo;m not the first one at Igalia to think this is really important. We already have a large Raspberry Pi board farm available on freedesktop\u0026rsquo;s GitLab instance that serves as a powerful tool for validating changes before they hit the main branch.\nFor a while, however, the etnaviv board farm has been offline. The main reason? I needed to clean up the setup: re-house it in a proper rack, redo all the wiring, and add more devices. What initially seemed like a few days\u0026rsquo; worth of work spiraled into months of delay, mostly because I wanted to transition to using ci-tron.\nGetting Familiar with the Ci-Tron Setup Before diving into my journey, let’s quickly cover what makes up a ci-tron board farm.\nCi-Tron Gateway: This component is the central hub that manages devices. PDU (Power Delivery Unit): A PDU is a device that manages the electrical power distribution to all the components in the CI farm. It allows you to remotely control the power, including power cycling devices, which is crucial for automating device management. DUT (Device Under Test): The heart of the CI farm—these are the devices where the actual testing happens. The Long Road to a Working Farm Over the past few months, I’ve been slowly preparing for the big ci-tron transition. The first step was ensuring my PDU was compatible. It wasn\u0026rsquo;t initially supported, but after some hacking, I got it working and submitted a merge request (MR). After a few rounds of revisions, it was merged, expanding ci-tron’s PDU support significantly.\nThe next and most critical step was getting a DUT to boot up correctly. Initially, ci-tron only supported iPXE as a boot method, but my devices are using U-Boot. I tried to make it work anyway, but the network initialization failed too often, and I found myself sinking hours into debugging.\nThankfully, rudimentary support for a U-Boot based boot flow was eventually added. After some tweaks, I managed to get my DUTs booting — but not without complications. A major problem was getting the correct Device Tree Blob (DTB) to load, which was needed for ci-tron\u0026rsquo;s training rounds. A Device Tree Blob (DTB) is a binary representation of the hardware layout of a device. The DTB is used by the Linux kernel to understand the hardware configuration, including components like the CPU, memory, and peripherals. In my case, ensuring that the correct DTB was provided was crucial for the DUT to boot and be correctly managed by ci-tron. While integrating the DTB into U-Boot was suggested, it wasn’t ideal. Updating the bootloader just to change a DTB is cumbersome, especially with multiple devices in the farm.\nWith the booting issue taking up too much time, I decided to put it on hold and focus on something else: gfxinfo.\nGfxinfo Integration Challenges gfxinfo is a neat feature that automatically tags a DUT based on the GPU model in the system, avoiding the need for manually assigning tags like gc2000. In theory, it’s very convenient—but in practice, there were hurdles.\ngfxinfo tags Vivante GPUs using the device tree node information. However, since Vivante GPUs are quite generic, they don’t have a specific model property that uniquely identifies them. The plan was to pull this information using ioctl() calls to the etnaviv kernel driver. It took a lot of back and forth in review due to the internal gfxinfo API being under-documented, but after a lot of effort, I finally got the necessary code merged. You can find all of it in this MR.\nFinal Push: Getting Everything to Boot There was still one major obstacle — getting the DUT to boot reliably. Luckily, mupuf was already working on it and made a significant MR with over 80 patches to address the boot issues. Introducing \u0026ldquo;boots db,\u0026rdquo; a feature designed to decouple the boot process, granting full control over DHCP, TFTP, and HTTP servers to each job. This is paired with YAML configurations to flexibly define the boot specifics for each board.\nAs of a few days ago, the latest official ci-tron gateway image contains everything needed to get an etnaviv DUT up and running successfully.\nI have to say, I’m very impressed with the end result. It took a lot longer than I had anticipated, but we finally have a plug-and-play CI farm solution for etnaviv. There are still a few missing features—like Network Block Device (NBD) support and some advanced statistics—but the ci-tron team is doing an excellent job, and I\u0026rsquo;m optimistic about what\u0026rsquo;s coming next.\nConclusion: A Long Road, but Worth It The journey to get the etnaviv board farm back online was longer than expected, full of unexpected challenges and technical hurdles. But it was worth it. The result is a robust, automated solution that makes CI testing easier and more reliable for everyone. With ci-tron, it’s easier to find and fix problems before they ever make it into the code base, which is exactly what a good CI setup should be all about. There is still some work to be done on the GitLab side to switch all etnaviv jobs to the new board farm.\nIf you\u0026rsquo;re thinking about setting up your own CI farm or migrating to ci-tron, I hope my experience helps smooth the road for you a bit. It might be a long journey, but the end results are absolutely worth it.\n","permalink":"https://playground.christian-gmeiner.info/2024-10-30-ci-tron-a-long-road-to-a-better-board-farm/","summary":"\u003cp\u003eI\u0026rsquo;m a big supporter of finding problems before they get into the code base. The earlier you catch issues, the easier they are to fix. One of the main tools that helps with this is a Continuous Integration (CI) farm. A CI farm allows you to run extensive tests like \u003ca href=\"https://github.com/KhronosGroup/VK-GL-CTS\"\u003edeqp\u003c/a\u003e or \u003ca href=\"https://piglit.freedesktop.org\"\u003epiglit\u003c/a\u003e on a merge request or even on a private git branch before any code is merged, which significantly helps catch problems early.\u003c/p\u003e","title":"CI-Tron: A Long Road to a Better Board Farm"},{"content":" Note\nThis blog post is part 1 of a series of blog posts about isaspec and its usage in the etnaviv GPU stack.\nI will add here links to the other blog posts, once they are published.\nThe first time I heard about isaspec, I was blown away by the possibilities it opens. I am really thankful that Igalia made it possible to complete this crucial piece of core infrastructure for the etnaviv GPU stack.\nIf isaspec is new to you, here is what the Mesa docs have to tell about it:\nisaspec provides a mechanism to describe an instruction set in XML, and generate a disassembler and assembler. The intention is to describe the instruction set more formally than hand-coded assembler and disassembler, and better decouple the shader compiler from the underlying instruction encoding to simplify dealing with instruction encoding differences between generations of GPU.\nBenefits of a formal ISA description, compared to hand-coded assemblers and disassemblers, include easier detection of new bit combinations that were not seen before in previous generations due to more rigorous description of bits that are expect to be ‘0’ or ‘1’ or ‘x’ (dontcare) and verification that different encodings don’t have conflicting bits (i.e. that the specification cannot result in more than one valid interpretation of any bit pattern).\nIf you are interested in more details, I highly recommend Rob Clark\u0026rsquo;s introduction to isaspec presentation.\nTarget ISA Vivante uses a fixed-size (128 bits), predictable instruction format with explicit inputs and outputs.\nAs of today, there are three different encodings seen in the wild:\nBase Instruction Set Extended Instruction Set Enhanced Vision Instruction Set (EVIS) Why do I want to switch to isaspec There are several reasons..\nThe current state The current ISA documentation is not very explicit and leaves lot of room for interpretation and speculation. One thing that it provides, are some nice explanations what an instruction does. isaspec does not support \u0026lt;doc\u0026gt; tags yet, but I there is a PoC MR that generates really nice looking and information ISA documentation based on the xml.\nI think soon you might find all etnaviv\u0026rsquo;s isaspec documentation at docs.mesa3d.org.\nNo unit tests There are no unit tests based on instructions generated by the blob driver. This might not sound too bad, but it opens the door to generating \u0026lsquo;bad\u0026rsquo; encoded instructions that could trigger all sorts of weird and hard-to-debug problems. Such breakages could be caused by some compiler rework, etc.\nIn an ideal world, there would be a unit test that does the following:\nDisassembles the binary representation of an instruction from the blob to a string representation. Verifies that it matches our expectation. Assembles the string representation back to 128 bits. Verifies that it matches the binary representation from the blob driver. This is our ultimate goal, which we really must reach. etnaviv will not be the only driver that does such deep unit testing - e.g. freedreno does it too.\nEasier to understand code Do you remember the rusticl OpenCL attempt for etnaviv? It contains lines like:\nif (nir_src_is_const(intr-\u0026gt;src[1])) { inst.tex.swiz = 128; } if (rmode == nir_rounding_mode_rtz) inst.tex.amode = 0x4 + INST_ROUND_MODE_RTZ; else /*if (rmode == nir_rounding_mode_rtne)*/ inst.tex.amode = 0x4 + INST_ROUND_MODE_RTNE; Do you clearly see what is going on? Why do we need to set tex.amode for an ALU instruction?\nI always found it quite disappointing to see such code snippets. Sure, they mimic what the blob driver is doing, but you might lose all the knowledge about why these bits are used that way days after you worked on it. There must be a cleaner, more understandable, and thus more maintainable way to document the ISA better.\nThis situation might become even worse if we want to support the other encodings and could end up with more of these bad patterns, resulting in a maintenance nightmare.\nOh, and if you wonder what happened to OpenCL and etnaviv - I promise there will be an update later this year.\nPython opens the door to generate lot of code As isaspec is written in Python, it is really easy to extend it and add support for new functionality.\nAt its core, we can generate a disassembler and an assembler based on isaspec. This alone saves us from writing a lot of code that needs to be kept in sync with all the ISA reverse engineering findings that happen over time.\nAs isaspec is just an ordinary XML file, you can use any programming language you like to work with it.\nOne source of truth I really fell in love with the idea of having one source of truth that models our target ISA, contains written documentation, and extends each opcode with meta information that can be used in the upper layers of the compiler stack.\nMissing Features I think I have sold you the idea quite well, so it must be a matter of some days to switch to it. Sadly no, as there are some missing features:\nOnly max 64 bits width ISAs are supported Its home in src/freedreno Alignment support is missing No \u0026lt;meta\u0026gt; tags are supported Add support for 128 bit wide instructions The first big MR I worked on, extended BITSET APIs with features needed for isaspec. Here we are talking about bitwise AND, OR, and NOT, and left shifts.\nThe next step was to switch isaspec to use the BITSET API to support wider ISAs. This resulted in a lot of commits, as there was a need for some new APIs to support handling this new feature. After these 31 commits, we were able to start looking into isaspec support for etnaviv.\nDecode Support Now it is time to start writing an isaspec XML for etnaviv, and the easiest opcode to start with is the nop. As the name suggests, it does nothing and has no src\u0026rsquo;s, no dst, or any other modifier.\nAs I do not have this initial version anymore, I tried to recreate it - it might have looked something like this:\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;isa\u0026gt; \u0026lt;bitset name=\u0026#34;#instruction\u0026#34;\u0026gt; \u0026lt;display\u0026gt; {NAME} void, void, void, void \u0026lt;/display\u0026gt; \u0026lt;pattern low=\u0026#34;6\u0026#34; high=\u0026#34;10\u0026#34;\u0026gt;00000\u0026lt;/pattern\u0026gt; \u0026lt;pattern pos=\u0026#34;11\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern pos=\u0026#34;12\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern low=\u0026#34;13\u0026#34; high=\u0026#34;26\u0026#34;\u0026gt;00000000000000\u0026lt;/pattern\u0026gt; \u0026lt;pattern low=\u0026#34;27\u0026#34; high=\u0026#34;31\u0026#34;\u0026gt;00000\u0026lt;/pattern\u0026gt; \u0026lt;pattern pos=\u0026#34;32\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern pos=\u0026#34;33\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern pos=\u0026#34;34\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern low=\u0026#34;35\u0026#34; high=\u0026#34;38\u0026#34;\u0026gt;0000\u0026lt;/pattern\u0026gt; \u0026lt;pattern pos=\u0026#34;39\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern low=\u0026#34;40\u0026#34; high=\u0026#34;42\u0026#34;\u0026gt;000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0 --\u0026gt; \u0026lt;pattern pos=\u0026#34;43\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0_USE --\u0026gt; \u0026lt;pattern low=\u0026#34;44\u0026#34; high=\u0026#34;52\u0026#34;\u0026gt;000000000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0_REG --\u0026gt; \u0026lt;pattern pos=\u0026#34;53\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern low=\u0026#34;54\u0026#34; high=\u0026#34;61\u0026#34;\u0026gt;00000000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0_SWIZ --\u0026gt; \u0026lt;pattern pos=\u0026#34;62\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0_NEG --\u0026gt; \u0026lt;pattern pos=\u0026#34;63\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0_ABS --\u0026gt; \u0026lt;pattern low=\u0026#34;64\u0026#34; high=\u0026#34;66\u0026#34;\u0026gt;000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0_AMODE --\u0026gt; \u0026lt;pattern low=\u0026#34;67\u0026#34; high=\u0026#34;69\u0026#34;\u0026gt;000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC0_RGROUP --\u0026gt; \u0026lt;!-- SRC1 --\u0026gt; \u0026lt;pattern pos=\u0026#34;70\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC1_USE --\u0026gt; \u0026lt;pattern low=\u0026#34;71\u0026#34; high=\u0026#34;79\u0026#34;\u0026gt;000000000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC1_REG --\u0026gt; \u0026lt;pattern low=\u0026#34;81\u0026#34; high=\u0026#34;88\u0026#34;\u0026gt;00000000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC1_SWIZ --\u0026gt; \u0026lt;pattern pos=\u0026#34;89\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC1_NEG --\u0026gt; \u0026lt;pattern pos=\u0026#34;90\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC1_ABS --\u0026gt; \u0026lt;pattern low=\u0026#34;91\u0026#34; high=\u0026#34;93\u0026#34;\u0026gt;000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC1_AMODE --\u0026gt; \u0026lt;pattern pos=\u0026#34;94\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern pos=\u0026#34;95\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern low=\u0026#34;96\u0026#34; high=\u0026#34;98\u0026#34;\u0026gt;000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC1_RGROUP --\u0026gt; \u0026lt;!-- SRC2 --\u0026gt; \u0026lt;pattern pos=\u0026#34;99\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC2_USE --\u0026gt; \u0026lt;pattern low=\u0026#34;100\u0026#34; high=\u0026#34;108\u0026#34;\u0026gt;000000000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC2_REG --\u0026gt; \u0026lt;pattern low=\u0026#34;110\u0026#34; high=\u0026#34;117\u0026#34;\u0026gt;00000000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC2_SWIZ --\u0026gt; \u0026lt;pattern pos=\u0026#34;118\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC2_NEG --\u0026gt; \u0026lt;pattern pos=\u0026#34;119\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC2_ABS --\u0026gt; \u0026lt;pattern pos=\u0026#34;120\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;pattern low=\u0026#34;121\u0026#34; high=\u0026#34;123\u0026#34;\u0026gt;000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC2_AMODE --\u0026gt; \u0026lt;pattern low=\u0026#34;124\u0026#34; high=\u0026#34;126\u0026#34;\u0026gt;000\u0026lt;/pattern\u0026gt; \u0026lt;!-- SRC2_RGROUP --\u0026gt; \u0026lt;pattern pos=\u0026#34;127\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;/bitset\u0026gt; \u0026lt;!-- opcocdes sorted by opc number --\u0026gt; \u0026lt;bitset name=\u0026#34;nop\u0026#34; extends=\u0026#34;#instruction\u0026#34;\u0026gt; \u0026lt;pattern low=\u0026#34;0\u0026#34; high=\u0026#34;5\u0026#34;\u0026gt;000000\u0026lt;/pattern\u0026gt; \u0026lt;!-- OPC --\u0026gt; \u0026lt;pattern pos=\u0026#34;80\u0026#34;\u0026gt;0\u0026lt;/pattern\u0026gt; \u0026lt;!-- OPCODE_BIT6 --\u0026gt; \u0026lt;/bitset\u0026gt;\u0026lt;/isa\u0026gt; With the knowledge of the old ISA documentation, I went fishing for instructions. I only used instructions from the binary blob for this process. It is quite important for me to have as many unit tests as I can write to not break any decoding with some isaspec XML changes I do. And it was a huge lifesaver at that time.\nAfter I reached almost feature parity with the old disassembler, I thought it was time to land etnaviv.xml and replace the current handwritten disassembler with a generated one - yeah, so I submitted an MR to make the switch.\nAs this is only a driver internal disassembler used by maybe 2-3 human beings, it would not be a problem if there were some regressions.\nToday I would say the isaspec disassembler is superior to the handwritten one.\nEncode Support The next item on my list was to add encoding support. As you can imagine, there was some work needed upfront to support ISAs that are bigger than 64 bits. This time the MR only contains two commits 😄.\nWith everything ready it is time to add isaspec based encoding support to etnaviv.\nThe goal is to drop our custom (and too simple) assembler and switch to one that is powered by isaspec.\nThis opens the door to:\nModeling special cases for instructions like a branch with no src\u0026rsquo;s to a new jump instruction. Doing the NIR src -\u0026gt; instruction src mapping in isaspec. Supporting different instruction encodings. Adding meta information to instructions. Supporting special instructions that are used in compiler unit tests In the end, all the magic that is needed is shown in the following diff:\ndiff --git a/src/etnaviv/isa/etnaviv.xml b/src/etnaviv/isa/etnaviv.xml index eca8241a2238a..c9a3ebe0a40c2 100644 --- a/src/etnaviv/isa/etnaviv.xml +++ b/src/etnaviv/isa/etnaviv.xml @@ -125,6 +125,13 @@ SPDX-License-Identifier: MIT \u0026lt;field name=\u0026#34;AMODE\u0026#34; low=\u0026#34;0\u0026#34; high=\u0026#34;2\u0026#34; type=\u0026#34;#reg_addressing_mode\u0026#34;/\u0026gt; \u0026lt;field name=\u0026#34;REG\u0026#34; low=\u0026#34;3\u0026#34; high=\u0026#34;9\u0026#34; type=\u0026#34;uint\u0026#34;/\u0026gt; \u0026lt;field name=\u0026#34;COMPS\u0026#34; low=\u0026#34;10\u0026#34; high=\u0026#34;13\u0026#34; type=\u0026#34;#wrmask\u0026#34;/\u0026gt; + +\t\u0026lt;encode type=\u0026#34;struct etna_inst_dst *\u0026#34;\u0026gt; +\t\u0026lt;map name=\u0026#34;DST_USE\u0026#34;\u0026gt;p-\u0026gt;DST_USE\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;AMODE\u0026#34;\u0026gt;src-\u0026gt;amode\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;REG\u0026#34;\u0026gt;src-\u0026gt;reg\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;COMPS\u0026#34;\u0026gt;p-\u0026gt;COMPS\u0026lt;/map\u0026gt; +\t\u0026lt;/encode\u0026gt; \u0026lt;/bitset\u0026gt; \u0026lt;bitset name=\u0026#34;#instruction\u0026#34; size=\u0026#34;128\u0026#34;\u0026gt; @@ -137,6 +144,46 @@ SPDX-License-Identifier: MIT \u0026lt;derived name=\u0026#34;TYPE\u0026#34; type=\u0026#34;#type\u0026#34;\u0026gt; \u0026lt;expr\u0026gt;{TYPE_BIT2} \u0026amp;lt;\u0026amp;lt; 2 | {TYPE_BIT01}\u0026lt;/expr\u0026gt; \u0026lt;/derived\u0026gt; + +\t\u0026lt;encode type=\u0026#34;struct etna_inst *\u0026#34; case-prefix=\u0026#34;ISA_OPC_\u0026#34;\u0026gt; +\t\u0026lt;map name=\u0026#34;TYPE_BIT01\u0026#34;\u0026gt;src-\u0026gt;type \u0026amp;amp; 0x3\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;TYPE_BIT2\u0026#34;\u0026gt;(src-\u0026gt;type \u0026amp;amp; 0x4) \u0026amp;gt; 2\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;LOW_HALF\u0026#34;\u0026gt;src-\u0026gt;sel_bit0\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;HIGH_HALF\u0026#34;\u0026gt;src-\u0026gt;sel_bit1\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;COND\u0026#34;\u0026gt;src-\u0026gt;cond\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;RMODE\u0026#34;\u0026gt;src-\u0026gt;rounding\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SAT\u0026#34;\u0026gt;src-\u0026gt;sat\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;DST_USE\u0026#34;\u0026gt;src-\u0026gt;dst.use\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;DST\u0026#34;\u0026gt;\u0026amp;amp;src-\u0026gt;dst\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;DST_FULL\u0026#34;\u0026gt;src-\u0026gt;dst_full\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;COMPS\u0026#34;\u0026gt;src-\u0026gt;dst.write_mask\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC0\u0026#34;\u0026gt;\u0026amp;amp;src-\u0026gt;src[0]\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC0_USE\u0026#34;\u0026gt;src-\u0026gt;src[0].use\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC0_REG\u0026#34;\u0026gt;src-\u0026gt;src[0].reg\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC0_RGROUP\u0026#34;\u0026gt;src-\u0026gt;src[0].rgroup\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC0_AMODE\u0026#34;\u0026gt;src-\u0026gt;src[0].amode\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC1\u0026#34;\u0026gt;\u0026amp;amp;src-\u0026gt;src[1]\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC1_USE\u0026#34;\u0026gt;src-\u0026gt;src[1].use\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC1_REG\u0026#34;\u0026gt;src-\u0026gt;src[1].reg\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC1_RGROUP\u0026#34;\u0026gt;src-\u0026gt;src[1].rgroup\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC1_AMODE\u0026#34;\u0026gt;src-\u0026gt;src[1].amode\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC2\u0026#34;\u0026gt;\u0026amp;amp;src-\u0026gt;src[2]\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC2_USE\u0026#34;\u0026gt;rc-\u0026gt;src[2].use\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC2_REG\u0026#34;\u0026gt;src-\u0026gt;src[2].reg\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC2_RGROUP\u0026#34;\u0026gt;src-\u0026gt;src[2].rgroup\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC2_AMODE\u0026#34;\u0026gt;src-\u0026gt;src[2].amode\u0026lt;/map\u0026gt; + +\t\u0026lt;map name=\u0026#34;TEX_ID\u0026#34;\u0026gt;src-\u0026gt;tex.id\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;TEX_SWIZ\u0026#34;\u0026gt;src-\u0026gt;tex.swiz\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;TARGET\u0026#34;\u0026gt;src-\u0026gt;imm\u0026lt;/map\u0026gt; + +\t\u0026lt;!-- sane defaults --\u0026gt; +\t\u0026lt;map name=\u0026#34;PMODE\u0026#34;\u0026gt;1\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SKPHP\u0026#34;\u0026gt;0\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;LOCAL\u0026#34;\u0026gt;0\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;DENORM\u0026#34;\u0026gt;0\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;LEFT_SHIFT\u0026#34;\u0026gt;0\u0026lt;/map\u0026gt; +\t\u0026lt;/encode\u0026gt; \u0026lt;/bitset\u0026gt; \u0026lt;bitset name=\u0026#34;#src-swizzle\u0026#34; size=\u0026#34;8\u0026#34;\u0026gt; @@ -148,6 +195,13 @@ SPDX-License-Identifier: MIT \u0026lt;field name=\u0026#34;SWIZ_Y\u0026#34; low=\u0026#34;2\u0026#34; high=\u0026#34;3\u0026#34; type=\u0026#34;#swiz\u0026#34;/\u0026gt; \u0026lt;field name=\u0026#34;SWIZ_Z\u0026#34; low=\u0026#34;4\u0026#34; high=\u0026#34;5\u0026#34; type=\u0026#34;#swiz\u0026#34;/\u0026gt; \u0026lt;field name=\u0026#34;SWIZ_W\u0026#34; low=\u0026#34;6\u0026#34; high=\u0026#34;7\u0026#34; type=\u0026#34;#swiz\u0026#34;/\u0026gt; + +\t\u0026lt;encode type=\u0026#34;uint8_t\u0026#34;\u0026gt; +\t\u0026lt;map name=\u0026#34;SWIZ_X\u0026#34;\u0026gt;(src \u0026amp;amp; 0x03) \u0026amp;gt;\u0026amp;gt; 0\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SWIZ_Y\u0026#34;\u0026gt;(src \u0026amp;amp; 0x0c) \u0026amp;gt;\u0026amp;gt; 2\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SWIZ_Z\u0026#34;\u0026gt;(src \u0026amp;amp; 0x30) \u0026amp;gt;\u0026amp;gt; 4\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SWIZ_W\u0026#34;\u0026gt;(src \u0026amp;amp; 0xc0) \u0026amp;gt;\u0026amp;gt; 6\u0026lt;/map\u0026gt; +\t\u0026lt;/encode\u0026gt; \u0026lt;/bitset\u0026gt; \u0026lt;enum name=\u0026#34;#thread\u0026#34;\u0026gt; @@ -272,6 +326,13 @@ SPDX-License-Identifier: MIT \u0026lt;/expr\u0026gt; \u0026lt;/derived\u0026gt; \u0026lt;/override\u0026gt; + +\t\u0026lt;encode type=\u0026#34;struct etna_inst_src *\u0026#34;\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC_SWIZ\u0026#34;\u0026gt;src-\u0026gt;swiz\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC_NEG\u0026#34;\u0026gt;src-\u0026gt;neg\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC_ABS\u0026#34;\u0026gt;src-\u0026gt;abs\u0026lt;/map\u0026gt; +\t\u0026lt;map name=\u0026#34;SRC_RGROUP\u0026#34;\u0026gt;p-\u0026gt;SRC_RGROUP\u0026lt;/map\u0026gt; +\t\u0026lt;/encode\u0026gt; \u0026lt;/bitset\u0026gt; \u0026lt;bitset name=\u0026#34;#instruction-alu-no-src\u0026#34; extends=\u0026#34;#instruction-alu\u0026#34;\u0026gt; One nice side effect of this work is the removal of isa.xml.h file that has been part of etnaviv since day one. We are able to generate all the file contents with isaspec and some custom python3 scripts. The move of instruction src swizzling from the driver into etnaviv.xml was super easy - less code to maintain!\nSummary I am really happy with the end result, even though it took quite some time from the initial idea to the point when everything was integrated into Mesa\u0026rsquo;s main git branch.\nThere is so much more to share - I can\u0026rsquo;t wait to publish parts II and III.\n","permalink":"https://playground.christian-gmeiner.info/2024-07-11-it-all-started-with-a-nop-part1/","summary":"\u003cstyle type=\"text/css\"\u003e\n     \n    .notice {\n        --title-color: #fff;\n        --title-background-color: #6be;\n        --content-color: #444;\n        --content-background-color: #e7f2fa;\n    }\n\n    .notice.info {\n        --title-background-color: #fb7;\n        --content-background-color: #fec;\n    }\n\n    .notice.tip {\n        --title-background-color: #5a5;\n        --content-background-color: #efe;\n    }\n\n    .notice.warning {\n        --title-background-color: #c33;\n        --content-background-color: #fee;\n    }\n\n     \n    @media (prefers-color-scheme:dark) {\n        .notice {\n            --title-color: #fff;\n            --title-background-color: #069;\n            --content-color: #ddd;\n            --content-background-color: #023;\n        }\n\n        .notice.info {\n            --title-background-color: #a50;\n            --content-background-color: #420;\n        }\n\n        .notice.tip {\n            --title-background-color: #363;\n            --content-background-color: #121;\n        }\n\n        .notice.warning {\n            --title-background-color: #800;\n            --content-background-color: #400;\n        }\n    }\n\n    body.dark .notice {\n        --title-color: #fff;\n        --title-background-color: #069;\n        --content-color: #ddd;\n        --content-background-color: #023;\n    }\n\n    body.dark .notice.info {\n        --title-background-color: #a50;\n        --content-background-color: #420;\n    }\n\n    body.dark .notice.tip {\n        --title-background-color: #363;\n        --content-background-color: #121;\n    }\n\n    body.dark .notice.warning {\n        --title-background-color: #800;\n        --content-background-color: #400;\n    }\n\n     \n    .notice {\n        padding: 18px;\n        line-height: 24px;\n        margin-bottom: 24px;\n        border-radius: 4px;\n        color: var(--content-color);\n        background: var(--content-background-color);\n    }\n\n    .notice p:last-child {\n        margin-bottom: 0\n    }\n\n     \n    .notice-title {\n        margin: -18px -18px 12px;\n        padding: 4px 18px;\n        border-radius: 4px 4px 0 0;\n        font-weight: 700;\n        color: var(--title-color);\n        background: var(--title-background-color);\n    }\n\n     \n    .icon-notice {\n        display: inline-flex;\n        align-self: center;\n        margin-right: 8px;\n    }\n\n    .icon-notice img,\n    .icon-notice svg {\n        height: 1em;\n        width: 1em;\n        fill: currentColor;\n    }\n\n    .icon-notice img,\n    .icon-notice.baseline svg {\n        top: .125em;\n        position: relative;\n    }\n\u003c/style\u003e\u003cdiv class=\"notice note\" \u003e\n    \u003cp class=\"notice-title\"\u003e\n        \u003cspan class=\"icon-notice baseline\"\u003e\n            \u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 128 300 300\"\u003e\n  \u003cpath d=\"M150 128c82.813 0 150 67.188 150 150 0 82.813-67.188 150-150 150C67.187 428 0 360.812 0 278c0-82.813 67.188-150 150-150Zm25 243.555v-37.11c0-3.515-2.734-6.445-6.055-6.445h-37.5c-3.515 0-6.445 2.93-6.445 6.445v37.11c0 3.515 2.93 6.445 6.445 6.445h37.5c3.32 0 6.055-2.93 6.055-6.445Zm-.39-67.188 3.515-121.289c0-1.367-.586-2.734-1.953-3.516-1.172-.976-2.93-1.562-4.688-1.562h-42.968c-1.758 0-3.516.586-4.688 1.563-1.367.78-1.953 2.148-1.953 3.515l3.32 121.29c0 2.734 2.93 4.882 6.64 4.882h36.134c3.515 0 6.445-2.148 6.64-4.883Z\"/\u003e\n\u003c/svg\u003e\n\n        \u003c/span\u003eNote\u003c/p\u003e","title":"It All Started With a Nop - Part I"},{"content":"Trusting hardware, particularly the registers that describe its functionality, is fundamentally risky.\ntl;dr The etnaviv GPU stack is continuously improving and becoming more robust. This time, a hardware database was incorporated into Mesa, utilizing header files provided by the SoC vendors.\nIf you are interested in the implementation details, I recommend checking out this Mesa MR.\nAre you employed at Versilicon and want to help? You could greatly simplify our work by supplying the community with a comprehensive header that includes all the models you offer.\nLast but not least: I deeply appreciate Igalia\u0026rsquo;s passion for open source GPU driver development, and I am grateful to be a part of the team. Their enthusiasm for open source work not only pushes the boundaries of technology but also builds a strong, collaborative community around it.\nThe good old days Years ago, when I began dedicating time to hacking on etnaviv, the kernel driver in use would read a handful of registers and relay the gathered information to the user space blob. This blob driver was then capable of identifying the GPU (including model, revision, etc.), supported features (such as DXT texture compression, seamless cubemaps, etc.), and crucial limits (like the number of registers, number of varyings, and so on).\nFor reverse engineering purposes, this interface is super useful. Image if you could change one of these feature bits on a target running the binary blob.\nWith libvivhook it is possible to do exactly this. From time to time, I am running such an old vendor driver stack on an i.MX 6QuadPlus SBC, which features a Vivante GC3000 as its GPU.\nSomewhere, I have a collection of scripts that I utilized to acquire additional knowledge about unknown GPU states activated when a specific feature bit was set.\nTo explore a simple example, let\u0026rsquo;s consider the case of misrepresenting a GPU\u0026rsquo;s identity as a GC2000. This involves modifying the information provided by the kernel driver to the user space, making the user space driver believe it is interacting with a GC2000 GPU. This scenario could be used for testing, debugging, or understanding how specific features or optimizations are handled differently across GPU models.\nexport ETNAVIV_CHIP_MODEL=\u0026#34;0x2000\u0026#34; export ETNAVIV_CHIP_REVISION=\u0026#34;0x5108\u0026#34; export ETNAVIV_FEATURES0_CLEAR=\u0026#34;0xFFFFFFFF\u0026#34; export ETNAVIV_FEATURES1_CLEAR=\u0026#34;0xFFFFFFFF\u0026#34; export ETNAVIV_FEATURES2_CLEAR=\u0026#34;0xFFFFFFFF\u0026#34; export ETNAVIV_FEATURES0_SET=\u0026#34;0xe0296cad\u0026#34; export ETNAVIV_FEATURES1_SET=\u0026#34;0xc9799eff\u0026#34; export ETNAVIV_FEATURES2_SET=\u0026#34;0x2efbf2d9\u0026#34; LD_PRELOAD=\u0026#34;/lib/viv_interpose.so\u0026#34; ./test-case If you capture the generated command stream and compare it with the one produced under the correct identity, you\u0026rsquo;ll observe many differences. This is super useful - I love it.\nChanging Tides: The Shift in ioctl() Interface At some point in time, Vivante changed their ioctl() interface and modified the gcvHAL_QUERY_CHIP_IDENTITY command. Instead of providing a very detailed chip identity, they reduced the data set to the following values:\nmodel revision product id eco id customer id This shift could indeed hinder reverse engineering efforts significantly. At a glance, it becomes impossible to alter any feature value, and understanding how the vendor driver processes these values is out of reach. Determining the function or impact of an unknown feature bit now seems unattainable.\nHowever, the kernel driver also requires a mechanism to verify the existing features of the GPU, as it needs to accommodate a wide variety of GPUs. Therefore, there must be some sort of system or method in place to ensure the kernel driver can effectively manage and support the diverse functionalities and capabilities of different GPUs.\nA New Approach: The Hardware Database Dilemma Let\u0026rsquo;s welcome: gc_feature_database.h, or hwdb for short.\nVivante transitioned to using a database that stores entries for limit values and feature bits. This database is accessed by querying with model, revision, product id, eco id and customer id.\nThere is some speculation why this move was done. My theory posits that they became frustrated with the recurring cycle of introducing feature bits to indicate the implementation of a feature, subsequently discovering problems with said feature, and then having to introduce additional feature bits to signal that the feature now truly operates as intended. It became far more straightforward to deactivate a malfunctioning feature by modifying information in the hardware database (hwdb). After they began utilizing the hwdb within the driver, updates to the feature registers in the hardware ceased.\nHere is a concrete example of such a case that can be found in the etnaviv gallium driver:\nscreen-\u0026gt;specs.tex_astc = VIV_FEATURE(screen, chipMinorFeatures4, TEXTURE_ASTC) \u0026amp;\u0026amp; !VIV_FEATURE(screen, chipMinorFeatures6, NO_ASTC); Meanwhile, in the etnaviv world there was a hybrid in the making. We stuck with the detailed feature words and found a smart way to convert from Vivante\u0026rsquo;s hwdb entries to our own in-kernel database. There is even a full blown Vivante -\u0026gt; etnaviv hwdb convert.\nAt that time, I did not fully understand all the consequences this approach would bring - more on that later. So, I dedicated my free time to reverse engineering and tweaking the user space driver, while letting the kernel developers do their thing.\nAbout a year after the initial hwdb landed in the kernel, I thought it might be a good idea to read out the extra id values, and provide them via sysfs to the user space. At that time, I already had the idea of moving the hardware database to user space in mind. However, I was preoccupied with other priorities that were higher on my to-do list, and I ended up forgetting about it.\nChallange accepted Tomeu Vizoso began to work on teflon and a Neural Processing Unit (NPU) driver within Mesa, leveraging a significant amount of the existing codebase and concepts, including the same kernel driver for the GPU. During this process, he encountered a need for some NPU-specific limit values. To address this, he added an in-kernel hwdb entry and made the limit values accessible to user space.\nThat\u0026rsquo;s it — the kernel supplies all the values the NPU driver requires. We\u0026rsquo;re finished, aren\u0026rsquo;t we?\nIt turns out, that there are many more NPU related values that need to be exposed in the same manner, with seemingly no end in sight.\nOne of the major drawbacks when the hardware database (hwdb) resides in the kernel is the considerable amount of time it takes for hwdb patches to be written, reviewed, and eventually merged into Linus\u0026rsquo;s git tree. This significantly slows down the development of user space drivers. For end users, this means they must either run a bleeding-edge kernel or backport the necessary changes on their own.\nFor me personally, the in-kernel hardware database should never have been implemented in its current form. If I could go back in time, I would have voiced my concerns.\nAs a result, moving the hardware database (hwdb) to user space quickly became a top priority on my to-do list, and I began working on it. However, during the testing phase of my proof of concept (PoC), I had to pause my work due to a kernel issue that made it unreliable for user space to trust the ID values provided by the kernel. Once my fix for this issue began to be incorporated into stable kernel versions, it was time to finalize the user space hwdb.\nThere is only one little but important detail we have not talked about yet. There are vendor specific versions of gc_feature_database.h based on different versions of the binary blob. For instance, there is one from NXP, ST, Amlogic and some more.\nHere is a brief look at the differences:\nnxp/gc_feature_database.h (autogenerated at 2023-10-24 16:06:00, 861 struct members, 27 entries) stm/gc_feature_database.h (autogenerated at 2022-12-29 11:13:00, 833 struct members, 4 entries) amlogic/gc_feature_database.h (autogenerated at 2021-04-12 17:20:00, 733 struct members, 8 entries) We understand that these header files are generated and adhere to a specific structure. Therefore, all we need to do is write an intelligent Python script capable of merging the struct members into a single consolidated struct. This script will also convert the old struct entries to the new format and generate a header file that we can use.\nI\u0026rsquo;m consistently amazed by how swiftly and effortlessly Python can be used for such tasks. Ninety-nine percent of the time, there\u0026rsquo;s a ready-to-use Python module available, complete with examples and some documentation. To address the C header parsing challenge, I opted for pycparser.\nThe final outcome is a generated hwdb.h file that looks and feels similar to those generated from the binary blob.\nFuture proof This header merging approach offers several advantages:\nIt simplifies the support for another SoC vendor. There\u0026rsquo;s no need to comprehend the significance of each feature bit. The source header files are supplied by Versilicon or the SoC vendor, ensuring accuracy. Updating the hwdb is straightforward — simply replace the files and rebuild Mesa. It allows for much quicker deployment of new features and hwdb updates since no kernel update is required. This method accelerates the development of user space drivers. While working on this topic I decided to do a bigger refactoring with the end goal to provide a struct etna_core_info that is located outside of the gallium driver.\nThis makes the code future proof and moves the filling of struct etna_core_info directly into the lowest layer - libetnaviv_drm (src/etnaviv/drm).\nWe have not yet talked about one important detail.\nWhat happens if there is no entry in the user space hwdb?\nThe solution is straightforward: we fallback to the previous method and request all feature words from the kernel driver. However, in an ideal scenario, our user space hardware database should supply all necessary entries. If you find that an entry for your GPU/NPU is missing, please get in touch with me.\nWhat about the in-kernel hwdb? The existing system, despite its limitations, is set to remain indefinitely, with new entries being added to accommodate new GPUs. Although it will never contain as much information as the user space counterpart, this isn\u0026rsquo;t necessarily a drawback. For the purposes at hand, only a handful of feature bits are required.\n","permalink":"https://playground.christian-gmeiner.info/2024-04-12-hwdb/","summary":"\u003cp\u003eTrusting hardware, particularly the registers that describe its functionality, is fundamentally risky.\u003c/p\u003e\n\u003ch1 id=\"tldr\"\u003etl;dr\u003c/h1\u003e\n\u003cp\u003eThe etnaviv GPU stack is continuously improving and becoming more robust. This time, a hardware database was incorporated into Mesa, utilizing header files provided by the SoC vendors.\u003c/p\u003e\n\u003cp\u003eIf you are interested in the implementation details, I recommend checking out this \u003ca href=\"https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28574\"\u003eMesa MR\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAre you employed at \u003ca href=\"https://www.verisilicon.com/\"\u003eVersilicon\u003c/a\u003e and want to help? You could greatly simplify our work by supplying the community with a comprehensive header that includes all the models you offer.\u003c/p\u003e","title":"hwdb - The only truth"},{"content":"Holidays are here and I have time to look back at 2023. For six months I have been working for Igalia and what should I say?\nI \u0026#x2764;\u0026#xfe0f; it!\nThis was the best decision to leave my comfort zone of a normal 9-5 job. I am so proud to work on open source GPU drivers and I am able to spend much of my work time on etnaviv.\nDriver maintenance Before adding any new feature I thought it would be great idea to improve the current state of etnaviv\u0026rsquo;s gallium driver. Therefor I reworked some general driver code to be more consistent and to have a more modern feeling, and made it possible to drop some hand-rolled conversion helpers by switching to already existing solutions (U_FIXED(..), S_FIXED(..), float_to_ubyte(..)).\nI worked through the low hanging fruits of crashes seen in CI runs and fixed many of them.\nFeature wise, I also looked at some easy to implement extensions like GL_NV_conditional_render and GL_OES_texture_half_float_linear.\nBesides the gallium driver I also worked on some NIR and isaspec features that are beneficial for etnaviv.\nXDC2023 A personal highlight was to give a talk about etnaviv at XDC2023 in person.\nYou might wonder what happened since mid October in etnaviv land.\nGLES3 I worked on some features that are needed to expose GLES3 and it turned out that an easy to maintain, extend and test compiler backend is needed. Sadly etnaviv\u0026rsquo;s current backend compiler does not check any of these boxes. It is so fragile that I only added some needed lowerings to pass some of the dEQP-GLES3.functional.shaders.texture_functions.* tests.\nSome more fun work regarding some feature emulation is on the horizon and it\u0026rsquo;s blocked again by the current compiler.\nBackend Compiler etnaviv includes an isaspec powered disassembler now - a small step towards a new backend compiler. Next on the road to success is the etnaviv backend IR with an assembler.\nThe new backend compiler is able to run OpenCL kernels with the help of rusticl but I want to land the new backend compiler in smaller chunks that are easier to review.\nMultiple Render Targets During my XDC presentation I talked about a feature I got working on GC7000L - Multiple Render Targets (MRT). At this point it was more or less a proof-of-concept regarding the gallium drivers. There were some missing bits and register for full support on more GPU models and therefore more reverse engineering work was needed. Also the gallium driver needed lots of work to add support for MRT.\nSome weeks later I had MRT working on a wider range of Vivante GPUs that are supporting this feature. This includes GC2000, GC3000 and GC7000 models among others. As etnaviv makes heavy use of GPU features it should work on even more models.\nLooking forward to 2024 I am really confident that we will see GLES3 and OpenCL for etnaviv. As driver testing is quite important for my work I will expand my current board farm and will look into the new star in CI world - ci-tron.\nWith that, have a happy holiday season and we\u0026rsquo;ll be back with more improvements in 2024!\n","permalink":"https://playground.christian-gmeiner.info/2022-12-26-end-of-year/","summary":"\u003cp\u003eHolidays are here and I have time to look back at 2023. For six months I have been working for \u003ca href=\"https://www.igalia.com/\"\u003eIgalia\u003c/a\u003e and what should I say?\u003c/p\u003e\n\u003cp\u003eI \u0026#x2764;\u0026#xfe0f; it!\u003c/p\u003e\n\u003cp\u003eThis was the best decision to leave my comfort zone of a normal 9-5 job. I am so proud to work on open source GPU drivers and I am able to spend much of my work time on etnaviv.\u003c/p\u003e\n\u003ch2 id=\"driver-maintenance\"\u003eDriver maintenance\u003c/h2\u003e\n\u003cp\u003eBefore adding any new feature I thought it would be great idea to improve the current state of etnaviv\u0026rsquo;s gallium driver. Therefor I reworked some general driver \u003ca href=\"https://cgit.freedesktop.org/mesa/mesa/commit/?id=ae828a33a74c5b3fc6abee481eac7cb57bf815d0\"\u003ecode\u003c/a\u003e to be more consistent and to have a more modern feeling, and made it possible to drop some \u003ca href=\"https://cgit.freedesktop.org/mesa/mesa/commit/?id=e13bdbbd5bfc1cef00cf504b0567238ae8f45524\"\u003ehand-rolled\u003c/a\u003e conversion helpers by switching to already existing solutions (\u003ccode\u003eU_FIXED(..)\u003c/code\u003e, \u003ccode\u003eS_FIXED(..)\u003c/code\u003e, \u003ccode\u003efloat_to_ubyte(..)\u003c/code\u003e).\u003c/p\u003e","title":"The Year 2023 in Retrospect"},{"content":"I recently bought a new device for my etnaviv board farm - STM32MP157C-DK2 Discovery Board.\nThe big problem is that the stock boot-chain can not boot a mainline kernel - it simply hangs.\nTF-A Trusted Firmware-A (TF-A) is a reference implementation of secure-world software used on this platform. It implements a secure monitor with various interface standards:\nThe power state coordination interface (PSCI) Trusted board boot requirements (TBBR) SMC calling convention System control and management interface More information can be found at the official website at https://www.trustedfirmware.org/.\nOn kernel side when you need to access to secure feature (like clocks, resets \u0026hellip;) you need to discuss it with this secure monitor using secure APIs. This APIs have not yet been pushed to mainline kernel. So It means that a mainline kernel can\u0026rsquo;t access to secure resources and it is the reason for the boot hang.\nu-boot - the solution It looks like that we can replace the current secure boot chain with u-boot in non-secure boot mode and call it a day.\nThis will generate two build artifacts:\nu-boot-spl.stm32 u-boot.img Lets copy these artifacts with dd directly to the suitable partition. ST has a quite nice wiki where we can find some more details.\nu-boot-spl.stm32 -\u0026gt; fsbl1 u-boot.img -\u0026gt; ssbl Lets boot it \u0026hellip; Connect all your cables and have a look at you serial console:\nAnd from there you can simply boot your mainline kernel:\n","permalink":"https://playground.christian-gmeiner.info/2019-12-19-stm32/","summary":"\u003cp\u003eI recently bought a new device for my etnaviv board farm - \u003ca href=\"https://www.st.com/en/evaluation-tools/stm32mp157c-dk2.html\"\u003eSTM32MP157C-DK2 Discovery Board\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe big problem is that the stock boot-chain can not boot a mainline kernel - it simply hangs.\u003c/p\u003e\n\u003ch3 id=\"tf-a\"\u003eTF-A\u003c/h3\u003e\n\u003cp\u003eTrusted Firmware-A (TF-A) is a reference implementation of secure-world software used on this platform. It implements a secure monitor with various interface standards:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe power state coordination interface (PSCI)\u003c/li\u003e\n\u003cli\u003eTrusted board boot requirements (TBBR)\u003c/li\u003e\n\u003cli\u003eSMC calling convention\u003c/li\u003e\n\u003cli\u003eSystem control and management interface\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMore information can be found at the official website at \u003ca href=\"https://www.trustedfirmware.org/\"\u003ehttps://www.trustedfirmware.org/\u003c/a\u003e.\u003c/p\u003e","title":"Mainline kernel boot with STM32MP157C-DK2 Discovery Board"},{"content":"This is a quick post for those of you looking for a completely free dynamic DNS solution for your home network running on Unifi.\nFor years, I was a happy DynDns user and even paid once for a premium plan. But now it is time for a change as I recently switched to Unfi network equipment including a USG. Currently, I am using Cloudflare for CDN, DDOS protection, free SSL certificates and DNS with a free account. Thankfully, Cloudflare has a free API that allows you to automatically update your DNS records.\nPreparation of the USG The installed version of ddclient on the USG is too old to support Cloudflare\u0026rsquo;s v4 API so we need to update it first.\nConfigure Cloudflare DDNS on the Controller With Controller version 5.10.25.0 it is not possible to configure Cloudflare DDNS via the UI, so we need to go another route. Luckily, the config.gateway.json is a file that sits in the UniFi Controller filesystem and allows custom changes to the USG that aren\u0026rsquo;t available in the web GUI. For more [information visit Unifi documentation here.\nAfter this step was done we are almost ready. Finally, we need to run a \u0026ldquo;force provision\u0026rdquo; to the USG in the UniFi Controller Devices \u0026gt; USG \u0026gt; Config \u0026gt; Manage Device \u0026gt; Force provision. That\u0026rsquo;s it!\nKeep in mind that chances are quite high that you might need to reupdate ddclient on the USG after an Firmware update.\n","permalink":"https://playground.christian-gmeiner.info/2019-07-13-cloudflare-ddns-usg/","summary":"\u003cp\u003eThis is a quick post for those of you looking for a completely free dynamic DNS solution for your home network running on Unifi.\u003c/p\u003e\n\u003cp\u003eFor years, I was a happy \u003ca href=\"https://dyn.com/dns\"\u003eDynDns\u003c/a\u003e user and even paid once for a premium plan. But now it is time for a change as I recently switched to \u003ca href=\"https://www.ui.com/\"\u003eUnfi\u003c/a\u003e network equipment including a \u003ca href=\"https://www.ui.com/unifi-routing/usg/\"\u003eUSG\u003c/a\u003e. Currently, I am using \u003ca href=\"https://cloudflare.com\"\u003eCloudflare\u003c/a\u003e for CDN, DDOS protection, free SSL certificates and DNS with a free account. Thankfully, Cloudflare has a free API that allows you to automatically update your DNS records.\u003c/p\u003e","title":"Cloudflare DDNS and Unifi USG"},{"content":"You might be familiar with mesamatrix - a nice site to track the state of all GPU drivers provided by Mesa. Ohh.. did I say all? Let\u0026rsquo;s have a closer look:\nThis page is a graphical representation of the text file docs/features.txt from the Mesa repository.\nSo wouldn\u0026rsquo;t it be sick to get etnaviv mentioned in docs/features.txt and onto the matrix?\nFirst mesamatrix needs to know/support etnaviv. This seems to be quite simple as there is already a pull request to add a bunch of embedded GPU drivers: Add VC4,VC5 and Vivante GPUs\nSecond we need is to add support for an easy to support extension. After skimming through the list I settled with ARB_seamless_cubemap_per_texture\nTo be fair I know that there are some UNK bits in the sampler registers and I hope one of them has something to do with seamless cubemaps. I went with a quick try-and-error approach to find the UNK bit which enables seamless cubemaps. And after 20 minutes of hacking the spec@amd_seamless_cubemap_per_texture@amd_seamless_cubemap_per_texture piglit works \\o/.\nThe end result can be found in in this merge request. I hope to merge the changes soon and see something new in mesamatrix.\n","permalink":"https://playground.christian-gmeiner.info/2019-06-16-mesamatrix/","summary":"\u003cp\u003eYou might be familiar with \u003ca href=\"https://mesamatrix.net/\"\u003emesamatrix\u003c/a\u003e - a nice site to track the state of all GPU drivers provided by Mesa. Ohh.. did I say all? Let\u0026rsquo;s have a closer look:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis page is a graphical representation of the text file docs/features.txt from the Mesa repository.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo wouldn\u0026rsquo;t it be sick to get etnaviv mentioned in docs/features.txt and onto the matrix?\u003c/p\u003e\n\u003cp\u003eFirst mesamatrix needs to know/support etnaviv. This seems to be quite simple as there is already a pull request to add a bunch of embedded GPU drivers: \u003ca href=\"https://github.com/MightyCreak/mesamatrix/pull/136\"\u003eAdd VC4,VC5 and Vivante GPUs\u003c/a\u003e\u003c/p\u003e","title":"mesamatrix"},{"content":"Written in Go, Hugo is an open source static site generator available under the Apache Licence 2.0. Hugo supports TOML, YAML and JSON data file types, Markdown and HTML content files and uses shortcodes to add rich content. Other notable features are taxonomies, multilingual mode, image processing, custom output formats, HTML/CSS/JS minification and support for Sass SCSS workflows.\nHugo makes use of a variety of open source projects including:\nhttps://github.com/yuin/goldmark https://github.com/alecthomas/chroma https://github.com/muesli/smartcrop https://github.com/spf13/cobra https://github.com/spf13/viper Hugo is ideal for blogs, corporate websites, creative portfolios, online magazines, single page applications or even a website with thousands of pages.\nHugo is for people who want to hand code their own website without worrying about setting up complicated runtimes, dependencies and databases.\nWebsites built with Hugo are extremely fast, secure and can be deployed anywhere including, AWS, GitHub Pages, Heroku, Netlify and any other hosting provider.\nLearn more and contribute on GitHub.\n","permalink":"https://playground.christian-gmeiner.info/about/","summary":"\u003cp\u003eWritten in Go, Hugo is an open source static site generator available under the \u003ca href=\"https://github.com/gohugoio/hugo/blob/master/LICENSE\"\u003eApache Licence 2.0.\u003c/a\u003e Hugo supports TOML, YAML and JSON data file types, Markdown and HTML content files and uses shortcodes to add rich content. Other notable features are taxonomies, multilingual mode, image processing, custom output formats, HTML/CSS/JS minification and support for Sass SCSS workflows.\u003c/p\u003e\n\u003cp\u003eHugo makes use of a variety of open source projects including:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/yuin/goldmark\"\u003ehttps://github.com/yuin/goldmark\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/alecthomas/chroma\"\u003ehttps://github.com/alecthomas/chroma\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/muesli/smartcrop\"\u003ehttps://github.com/muesli/smartcrop\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spf13/cobra\"\u003ehttps://github.com/spf13/cobra\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spf13/viper\"\u003ehttps://github.com/spf13/viper\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHugo is ideal for blogs, corporate websites, creative portfolios, online magazines, single page applications or even a website with thousands of pages.\u003c/p\u003e","title":"About"},{"content":"From time to time I need to inspect a used device-tree of a running device. For instance, the used bootloader (u-boot, barebox, \u0026hellip;) patches the the initial specified dtb and I want to see the modified one. All that is needed is an installed device-tree-compiler on the target.\n$ dtc -I fs -O dts /sys/firmware/devicetree/base ","permalink":"https://playground.christian-gmeiner.info/2017-09-20-device-tree-introspection/","summary":"\u003cp\u003eFrom time to time I need to inspect a used device-tree of a running device. For instance, the used bootloader (u-boot, barebox, \u0026hellip;) patches the the initial specified dtb and I want to see the modified one. All that is needed is an installed device-tree-compiler on the target.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ dtc -I fs -O dts /sys/firmware/devicetree/base\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"device-tree introspection"},{"content":"After years of hard work the etnaviv team reached an other very important milestone. The gallium driver and the renderonly library got pushed into mesa\u0026rsquo;s git repository and will be released with mesa 17.0 - yeah!\nThis does not mean we are done with development at all. There are many interesting topics to work on and some of them like better support for newer IP cores or a reworked GLSL compiler should see the light of day during the next months.\nI think 2017 will be a quite interesting one for etnaviv and open source GPU drivers in general.\nAt this point I want to thank a lot of people who helped out in different areas. The whole mesa community (esp. Rob, Ilia and Emil), SolidRun for provided hardware, Pengutronix - the \u0026lsquo;imx6-company\u0026rsquo; - for doing a wonderful job in the kernel space and all the other guys I meet in real life or via irc/mail.\n","permalink":"https://playground.christian-gmeiner.info/2017-01-12-etnaviv-officially-landed-in-mesa/","summary":"\u003cp\u003eAfter years of hard work the etnaviv team reached an other very important milestone. The gallium driver and the renderonly library got pushed into mesa\u0026rsquo;s git repository and will be released with mesa 17.0 - yeah!\u003c/p\u003e\n\u003cp\u003eThis does not mean we are done with development at all. There are many interesting topics to work on and some of them like better support for newer IP cores or a reworked GLSL compiler should see the light of day during the next months.\u003c/p\u003e","title":"etnaviv officially landed"},{"content":"As HTTPS is a must nowadays I decided a year a go to give it a try and got a certificate from startssl. The process at startssl took quite some time and was not that easy. With lets encrypt everything should be much easier and faster to setup – lets give it a try @ueberspace (my hoster).\nThere is a very good (German) tutorial directly from ueberspace for the whole process. Two minutes later everything was done and it worked! There is only one missing part. As the generated certificate is only valid for 90 days I created a little script which gets run every month – thanks to cron.\nView the code on [Gist](https://gist.github.com/austriancoder/911ca10c26dd24ac6b585ad4a62242a6). ","permalink":"https://playground.christian-gmeiner.info/2016-01-30-lets-encrypt/","summary":"\u003cp\u003eAs HTTPS is a must nowadays I decided a year a go to give it a try and got a certificate from \u003ca href=\"https://www.startssl.com/\"\u003estartssl\u003c/a\u003e. The process at startssl took quite some time and was not that easy. With \u003ca href=\"https://letsencrypt.org\"\u003elets encrypt\u003c/a\u003e everything should be much easier and faster to setup – lets give it a try @\u003ca href=\"https://uberspace.de/\"\u003eueberspace\u003c/a\u003e (my hoster).\u003c/p\u003e\n\u003cp\u003eThere is a very good (German) \u003ca href=\"https://funkenstrahlen.de/blog/2015/12/19/lets-encrypt-auf-uberspace/\"\u003etutorial directly from ueberspace\u003c/a\u003e for the whole process. Two minutes later everything was done and it worked! There is only one missing part. As the generated certificate is only valid for 90 days I created a little script which gets run every month – thanks to cron.\u003c/p\u003e","title":"Let’s Encrypt"},{"content":"Last Friday I got kmscube successfully running with mesa and the new etnaviv DRM kernel driver. At this time I got it not really pixel perfect and I spend some nights to get it fixed. It turns out that I need a small mesa hack to get the rendering correct.\nYou may ask why did it so long to get it working? Let me explain it to you.\nThe Vivnate GPU is a so called render-only GPU which does not have any kind of scanout logic in it. It can only render to physical memory and this only in a tiled memory layout. So we need to use the resolve engine found on the GPU to de-tile the rendered image and blit it to the dumb buffer. Currently mesa has no software support for this kind of hardware, but I think that could change soon.\nI think that this is a huge step into the right direction. All the needed sources can be found on my github account. At the moment I am cleaning up the code and shortly I will send out RFC patch series for libdrm and mesa. Currently some hacks are needed to get it up an running so there is still a lot left to do.\nYes I think libdrm is needed and should not be part of the gallium driver. I even think xf86-video-armada could be using libdrm-etnaviv sooner or later. This one of the topics on my huge TODO list.\nRussell does not want to maintain a 3rd GPU backend and with that fact I think I will merge the etnaviv libdrm part directly into the driver. Let’s see how the patch series gets accepted.\nI think this the perfect time to say “thank you” to some guys. Wladimir thanks for the wonderful code basis you provided for the whole etnaviv project. Rob, thanks for your patience with me – at this point in time I was a complete newbie in the mesa source code and the whole GPU world. Thanks NVIDIA for their wonderful render-only patch. Emil thanks for helping me out with ideas to get render-only into a working state. Also quite important for spare-time open source development is a hardware sponsor. In may case I want to thank SolidRun for sending me two devices for etnaviv development purposes.\n","permalink":"https://playground.christian-gmeiner.info/2015-09-25-etnaviv-kmscube/","summary":"\u003cp\u003eLast Friday I got kmscube successfully running with mesa and the new etnaviv DRM kernel driver. At this time I got it not really pixel perfect and I spend some nights to get it fixed. It turns out that I need a small mesa hack to get the rendering correct.\u003c/p\u003e\n\u003ciframe allowfullscreen=\"\" frameborder=\"0\" height=\"473\" src=\"https://www.youtube.com/embed/vjIBow3M-C4?feature=oembed\" width=\"840\"\u003e\u003c/iframe\u003e\n\u003cp\u003eYou may ask why did it so long to get it working? Let me explain it to you.\u003c/p\u003e\n\u003cp\u003eThe Vivnate GPU is a so called render-only GPU which does not have any kind of scanout logic in it. It can only render to physical memory and this only in a tiled memory layout. So we need to use the resolve engine found on the GPU to de-tile the rendered image and blit it to the dumb buffer. Currently mesa has  no software support for this kind of hardware, but I think that could change soon.\u003c/p\u003e","title":"etnaviv: kmscube"},{"content":"I think that almost every C++ programmer looked into a nice and easy way to do C++ Enum serialization. You may want to store the Enum value in a human readable format (json, ini, ..) and later you may also want to read back the value into the object.\nYou have here two way how to archive your goal. Use simple int values to represent the Enum value or use Strings. The big advantage with strings it that you do not have to lookup what the meaning of value 4 is, but you can name the value with a String.\nHere I will present you with an non QObject based way of doing it in Qt5. You may wonder why I do not want to use a QObject as base for my class. The answer is quite simple. I need to be able to have a copy constructor and assignment operator for my class.\nSo lets start with the simple class Item which has Enum called Type in it.\nView the code on [Gist](https://gist.github.com/austriancoder/9bb0c0782aafa4bb1dbcc653e9442a33).The big goal is to get Item::type() and Item::setType(QString) working as expected. Here is a small demo main(), which will be used for testing. View the code on [Gist](https://gist.github.com/austriancoder/9bb0c0782aafa4bb1dbcc653e9442a33).We exspect the following output: “APPLE” “CAR” “BIRD”\nHere Qt’s MetaObject system comes to help. We use the MetaObject to get the correct QMetaEnum and make use of its valueToKey(..) and keyToValue(..) methods.\nView the code on [Gist](https://gist.github.com/austriancoder/9bb0c0782aafa4bb1dbcc653e9442a33).In order to get this up and working we need to modify our header file. View the code on [Gist](https://gist.github.com/austriancoder/9bb0c0782aafa4bb1dbcc653e9442a33).The needed pars are here Q_GADGET to get the processed by the meta object compiler (moc) Q_ENUMS to ‘export’ the enum to the metaObject Qt’s MetaObject system saved my day and helped me to easily serialize C++ Enums in a very elegant way. The other more hacky solution would have been a big if-castle to check for each possible value and do everything on my own. But this could lead to problems if the Enum gets extended by an other developer not aware of the hand-written conversion methods.\nAll in all I am very happy with this solution.\n","permalink":"https://playground.christian-gmeiner.info/2015-05-25-qmetaenum-serializing-c-enums/","summary":"\u003cp\u003eI think that almost every C++ programmer looked into a nice and easy way to do C++ Enum serialization. You may want to store the Enum value in a human readable format (json, ini, ..) and later you may also want to read back the value into the object.\u003c/p\u003e\n\u003cp\u003eYou have here two way how to archive your goal. Use simple int values to represent the Enum value or use Strings. The big advantage with strings it that you do not have to lookup what the meaning of value 4 is, but you can name the value with a String.\u003c/p\u003e","title":"QMetaEnum: Serializing C++ Enums"},{"content":"Today I did a fresh installation of Fedora on my Chromebook and need to setup git send-email. Usually I need to do this step once every 1-2 years I thought it might be a good idea to write it down.\nEdit ~/.gitconfig\n[sendemail] from = Firstname Lastname email@gmail.com smtpserver = smtp.gmail.com smtpuser = email@gmail.com smtpencryption = tls smtppass = PASSWORD chainreplyto = false smtpserverport = 587\nAs I am using Googles two factor authentication I needed to generate an app specific password.\n","permalink":"https://playground.christian-gmeiner.info/2015-04-06-configure-git-send-email-for-gmail/","summary":"\u003cp\u003eToday I did a fresh installation of Fedora on my Chromebook and need to setup git send-email. Usually I need to do this step once every 1-2 years I thought it might be a good idea to write it down.\u003c/p\u003e\n\u003cp\u003eEdit ~/.gitconfig\u003c/p\u003e\n\u003cp\u003e[sendemail] from = Firstname Lastname \u003ca href=\"mailto:email@gmail.com\"\u003eemail@gmail.com\u003c/a\u003e smtpserver = smtp.gmail.com smtpuser = \u003ca href=\"mailto:email@gmail.com\"\u003eemail@gmail.com\u003c/a\u003e smtpencryption = tls smtppass = PASSWORD chainreplyto = false smtpserverport = 587\u003c/p\u003e\n\u003cp\u003eAs I am using Googles two factor authentication I needed to generate an app specific password.\u003c/p\u003e","title":"Configure git send-email for gmail"},{"content":"It has been a long time since I did the last post and I want to bring you up to date regarding my personal blog. As you might have seen I have changed the used theme to better support mobile devices.\nIf your browser supports NSI you should access my blog via https now. It took me some time to setup everything but my new hoster ueberspace made it a breeze to setup everything – thanks.\nThe biggest time safer for me is the switch to disqus comment system as it is quite time consuming to manage all the comments in the spam queue.\nI hope you enjoy the new site and in the next blog I will talk about the current state of my biggest hobby project – etnaviv\n","permalink":"https://playground.christian-gmeiner.info/2015-03-08-fast-forward-to-2015/","summary":"\u003cp\u003eIt has been a long time since I did the last post and I want to bring you up to date regarding my personal blog. As you might have seen I have changed the used theme to better support mobile devices.\u003c/p\u003e\n\u003cp\u003eIf your browser supports \u003ca href=\"http://en.wikipedia.org/wiki/Server_Name_Indication\"\u003eNSI\u003c/a\u003e you should access my blog via https now. It took me some time to setup everything but my new hoster \u003ca href=\"http://www.uberspace.de\"\u003eueberspace\u003c/a\u003e made it a breeze to setup everything – thanks.\u003c/p\u003e","title":"Fast forward to 2015"},{"content":"It took me some time to rework the device tree bindings but it looks like it starts to work!\nView the code on [Gist](https://gist.github.com/austriancoder/6196fa33011a120a01dd54dbd077a60d).Gets loaded into : [ 3.358155] vivante: module is from the staging directory, the quality is unknown, you have been warned. [ 3.373087] imx-sgtl5000 sound.15: sgtl5000 2028000.ssi mapping ok [ 3.379150] [drm] add child gpu2d [ 3.379154] [drm] add child gpu3d [ 3.380395] vivante-gpu 134000.gpu2d: pre gpu[idx]: 0x00000000 [ 3.380401] vivante-gpu 134000.gpu2d: adding core @idx 1 [ 3.380408] vivante-gpu 134000.gpu2d: post gpu[idx]: 0xecb56c10 [ 3.380460] vivante gpu-subsystem.11: bound 134000.gpu2d (ops gpu_ops [vivante]) [ 3.380467] vivante-gpu 130000.gpu3d: pre gpu[idx]: 0x00000000 [ 3.380473] vivante-gpu 130000.gpu3d: adding core @idx 0 [ 3.380479] vivante-gpu 130000.gpu3d: post gpu[idx]: 0xecb57210 [ 3.380502] vivante gpu-subsystem.11: bound 130000.gpu3d (ops gpu_ops [vivante]) [ 3.380533] IO:R f0200018 14010000 [ 3.380537] IO:R f0200020 00002000 [ 3.380540] IO:R f0200024 00005108 [ 3.380546] vivante gpu-subsystem.11: model: 2000 [ 3.380551] vivante gpu-subsystem.11: revision: 5108 [ 3.380554] IO:R f020001c e0296cad [ 3.380558] IO:R f0200034 c9799eff [ 3.380561] IO:R f0200074 2efbf2d9 [ 3.380564] IO:R f0200084 00000000 [ 3.380567] IO:R f0200088 00000000 [ 3.380572] vivante gpu-subsystem.11: minor_features: c9799eff [ 3.380578] vivante gpu-subsystem.11: minor_features1: 2efbf2d9 [ 3.380583] vivante gpu-subsystem.11: minor_features2: 0 [ 3.380588] vivante gpu-subsystem.11: minor_features3: 0 [ 3.380592] IO:R f0200000 00070100 [ 3.408629] IO:R f0200004 7fffffff [ 3.408632] IO:R f0200000 00070100 [ 3.412940] vivante gpu-subsystem.11: 130000.gpu3d: using IOMMU [ 3.413080] IO:R f01f8018 14010000 [ 3.413083] IO:R f01f8020 00000320 [ 3.413087] IO:R f01f8024 00005007 [ 3.413093] vivante gpu-subsystem.11: model: 320 [ 3.413098] vivante gpu-subsystem.11: revision: 5007 [ 3.413101] IO:R f01f801c e02c7eca [ 3.413105] IO:R f01f8034 c1399eff [ 3.413108] IO:R f01f8074 020fb2db [ 3.413111] IO:R f01f8084 00000000 [ 3.413114] IO:R f01f8088 00000000 [ 3.413120] vivante gpu-subsystem.11: minor_features: c1399eff [ 3.413126] vivante gpu-subsystem.11: minor_features1: 20fb2db [ 3.413131] vivante gpu-subsystem.11: minor_features2: 0 [ 3.413136] vivante gpu-subsystem.11: minor_features3: 0 [ 3.413139] IO:R f01f8000 00070100 [ 3.438615] IO:R f01f8004 7fffffff [ 3.438619] IO:R f01f8000 00070100 [ 3.442583] vivante gpu-subsystem.11: 134000.gpu2d: using IOMMU [ 3.442681] [drm] Initialized vivante 1.0.0 20130625 on minor 1\n","permalink":"https://playground.christian-gmeiner.info/2014-05-24-vivante-meets-devicetree/","summary":"\u003cp\u003eIt took me some time to rework the device tree bindings but it looks like it starts to work!\u003c/p\u003e\n\u003cdiv class=\"oembed-gist\"\u003e\u003cscript src=\"https://gist.github.com/austriancoder/6196fa33011a120a01dd54dbd077a60d.js\"\u003e\u003c/script\u003e\u003cnoscript\u003eView the code on [Gist](https://gist.github.com/austriancoder/6196fa33011a120a01dd54dbd077a60d).\u003c/noscript\u003e\u003c/div\u003eGets loaded into :\n\u003cp\u003e[ 3.358155] vivante: module is from the staging directory, the quality is unknown, you have been warned.\n[ 3.373087] imx-sgtl5000 sound.15: sgtl5000 2028000.ssi mapping ok\n[ 3.379150] [drm] add child gpu2d\n[ 3.379154] [drm] add child gpu3d\n[ 3.380395] vivante-gpu 134000.gpu2d: pre gpu[idx]: 0x00000000\n[ 3.380401] vivante-gpu 134000.gpu2d: adding core @idx 1\n[ 3.380408] vivante-gpu 134000.gpu2d: post gpu[idx]: 0xecb56c10\n[ 3.380460] vivante gpu-subsystem.11: bound 134000.gpu2d (ops gpu_ops [vivante])\n[ 3.380467] vivante-gpu 130000.gpu3d: pre gpu[idx]: 0x00000000\n[ 3.380473] vivante-gpu 130000.gpu3d: adding core @idx 0\n[ 3.380479] vivante-gpu 130000.gpu3d: post gpu[idx]: 0xecb57210\n[ 3.380502] vivante gpu-subsystem.11: bound 130000.gpu3d (ops gpu_ops [vivante])\n[ 3.380533] IO:R f0200018 14010000\n[ 3.380537] IO:R f0200020 00002000\n[ 3.380540] IO:R f0200024 00005108\n[ 3.380546] vivante gpu-subsystem.11: model: 2000\n[ 3.380551] vivante gpu-subsystem.11: revision: 5108\n[ 3.380554] IO:R f020001c e0296cad\n[ 3.380558] IO:R f0200034 c9799eff\n[ 3.380561] IO:R f0200074 2efbf2d9\n[ 3.380564] IO:R f0200084 00000000\n[ 3.380567] IO:R f0200088 00000000\n[ 3.380572] vivante gpu-subsystem.11: minor_features: c9799eff\n[ 3.380578] vivante gpu-subsystem.11: minor_features1: 2efbf2d9\n[ 3.380583] vivante gpu-subsystem.11: minor_features2: 0\n[ 3.380588] vivante gpu-subsystem.11: minor_features3: 0\n[ 3.380592] IO:R f0200000 00070100\n[ 3.408629] IO:R f0200004 7fffffff\n[ 3.408632] IO:R f0200000 00070100\n[ 3.412940] vivante gpu-subsystem.11: 130000.gpu3d: using IOMMU\n[ 3.413080] IO:R f01f8018 14010000\n[ 3.413083] IO:R f01f8020 00000320\n[ 3.413087] IO:R f01f8024 00005007\n[ 3.413093] vivante gpu-subsystem.11: model: 320\n[ 3.413098] vivante gpu-subsystem.11: revision: 5007\n[ 3.413101] IO:R f01f801c e02c7eca\n[ 3.413105] IO:R f01f8034 c1399eff\n[ 3.413108] IO:R f01f8074 020fb2db\n[ 3.413111] IO:R f01f8084 00000000\n[ 3.413114] IO:R f01f8088 00000000\n[ 3.413120] vivante gpu-subsystem.11: minor_features: c1399eff\n[ 3.413126] vivante gpu-subsystem.11: minor_features1: 20fb2db\n[ 3.413131] vivante gpu-subsystem.11: minor_features2: 0\n[ 3.413136] vivante gpu-subsystem.11: minor_features3: 0\n[ 3.413139] IO:R f01f8000 00070100\n[ 3.438615] IO:R f01f8004 7fffffff\n[ 3.438619] IO:R f01f8000 00070100\n[ 3.442583] vivante gpu-subsystem.11: 134000.gpu2d: using IOMMU\n[ 3.442681] [drm] Initialized vivante 1.0.0 20130625 on minor 1\u003c/p\u003e","title":"Vivante meets devicetree"},{"content":" Sometimes is is quite handy to have access to a JTAG interface to look more deeply into problems. The weapon of choice is an Olimex ARM-USB-OCD-H JTAG in combination with OpenOCD 0.8.0. First we will need to install OpenOCD.\napt-get install libftdi-dev Download and extract OpenOCD 0.8.0 run ./configure run make \u0026amp;\u0026amp; make install This should give you an OpenOCD installation with the following configuration:\nOpenOCD configuration summary \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026ndash; MPSSE mode of FTDI based devices yes (auto) ST-Link JTAG Programmer yes (auto) TI ICDI JTAG Programmer yes (auto) Keil ULINK JTAG Programmer yes (auto) Altera USB-Blaster II Compatible yes (auto) Segger J-Link JTAG Programmer yes (auto) OSBDM (JTAG only) Programmer yes (auto) eStick/opendous JTAG Programmer yes (auto) Andes JTAG Programmer yes (auto) Versaloon-Link JTAG Programmer yes (auto) USBProg JTAG Programmer yes (auto) Raisonance RLink JTAG Programmer yes (auto) Olimex ARM-JTAG-EW Programmer yes (auto) CMSIS-DAP Compliant Debugger no\nNow its time to check if a debugger connection can be established. As the JTAG is usb based you should see it via lsusb.\nBus 002 Device 005: ID 15ba:002b Olimex Ltd. ARM-USB-OCD-H JTAG+RS232 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x15ba Olimex Ltd. idProduct 0x002b ARM-USB-OCD-H JTAG+RS232 bcdDevice 7.00 iManufacturer 1 Olimex iProduct 2 Olimex OpenOCD JTAG ARM-USB-OCD-H iSerial 3 OLWI19GT bNumConfigurations 1 [\u0026hellip;]\nAt this point OpenOCD should be able to connect to the JTAG. For the beginning you only need to provide the interface and target scripts. In my case the following works.\nchristian@chgm-pc:~$ sudo openocd -f interface/ftdi/olimex-arm-usb-ocd-h.cfg -f target/imx6.cfg Open On-Chip Debugger 0.8.0 (2014-05-05-11:14) Licensed under GNU GPL v2 For bug reports, read http://openocd.sourceforge.net/doc/doxygen/bugs.html Info : only one transport option; autoselect \u0026lsquo;jtag\u0026rsquo; Warn : imx6.sdma: nonstandard IR value adapter speed: 1000 kHz Info : clock speed 1000 kHz Info : JTAG tap: imx6.dap tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4) Info : TAP imx6.sdma does not have IDCODE Info : JTAG tap: imx6.sjc tap/device found: 0x2191e01d (mfg: 0x00e, part: 0x191e, ver: 0x2) Info : imx6.cpu.0: hardware has 6 breakpoints, 4 watchpoints Info : number of cache level 1 Info : imx6.cpu.0 cluster 0 core 0 multi core\n","permalink":"https://playground.christian-gmeiner.info/2014-05-17-openocd-and-the-imx6/","summary":"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2014/05/olimex.jpg\"\u003e\u003cimg alt=\"olimex\" loading=\"lazy\" src=\"/wp-content/uploads/2014/05/olimex-768x1024.jpg\"\u003e\u003c/a\u003e\nSometimes is is quite handy to have access to a JTAG interface to look more deeply into problems.  The weapon of choice is an \u003ca href=\"https://www.olimex.com/Products/ARM/JTAG/ARM-USB-OCD-H/\"\u003eOlimex ARM-USB-OCD-H JTAG\u003c/a\u003e in combination with \u003ca href=\"http://openocd.sourceforge.net/\" title=\"OpenOCD\"\u003eOpenOCD\u003c/a\u003e 0.8.0.\nFirst we will need to install OpenOCD.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eapt-get install libftdi-dev\u003c/li\u003e\n\u003cli\u003eDownload and extract OpenOCD 0.8.0\u003c/li\u003e\n\u003cli\u003erun ./configure\u003c/li\u003e\n\u003cli\u003erun make \u0026amp;\u0026amp; make install\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis should give you an OpenOCD installation with the following configuration:\u003c/p\u003e\n\u003cp\u003eOpenOCD configuration summary \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026ndash; MPSSE mode of FTDI based devices yes (auto) ST-Link JTAG Programmer yes (auto) TI ICDI JTAG Programmer yes (auto) Keil ULINK JTAG Programmer yes (auto) Altera USB-Blaster II Compatible yes (auto) Segger J-Link JTAG Programmer yes (auto) OSBDM (JTAG only) Programmer yes (auto) eStick/opendous JTAG Programmer yes (auto) Andes JTAG Programmer yes (auto) Versaloon-Link JTAG Programmer yes (auto) USBProg JTAG Programmer yes (auto) Raisonance RLink JTAG Programmer yes (auto) Olimex ARM-JTAG-EW Programmer yes (auto) CMSIS-DAP Compliant Debugger no\u003c/p\u003e","title":"OpenOCD and the iMX6"},{"content":"I did spend quite some time the last days to figure out how the MMU v1 could work and what all the code in the v4 Kernel sources does. It took quite some time and a little hint from Russel to finally understand it. So lets start with the technical details.\nThe MMU uses a page table with a maximum size of 256KB. Where each Page Table Entry (PTE) is 4 byte long. The used page size is 4K and can not be changed via some registers etc. Lets have a look at the bit layout of a PTE.\nWhat does all that code in the v4 driver? In the end it turned out to be a ‘simple’ memory manager. All the code is needed to keep track of which pages are mapped into the GPU address area. Index 0 of the big page table array maps directly to GPU address 0x80000000 and index 1 maps directly to 0x80001000. We can quite easily map Linux kernel pages into the address range of the GPU.\nThe solution I am working on will use drm_mm as memory manager and the iommu framework to keep the page table in sync.\n","permalink":"https://playground.christian-gmeiner.info/2014-05-03-vivante-mmu-v1/","summary":"\u003cp\u003eI did spend quite some time the last days to figure out how the MMU v1 could work and what all the code in the v4 Kernel sources does. It took quite some time and a little hint from Russel to finally understand it. So lets start with the technical details.\u003c/p\u003e\n\u003cp\u003eThe MMU uses a page table with a maximum size of 256KB. Where each Page Table Entry (PTE) is 4 byte long. The used page size is 4K and can not be changed via some registers etc.\nLets have a look at the bit layout of a PTE.\u003c/p\u003e","title":"Vivante MMU v1"},{"content":"Today I wanted to debug a Qt based application within QtCreator but failed. After a quick google I found the solution:\nView the code on [Gist](https://gist.github.com/austriancoder/c2733a5ca5cfa9c23fe99c27811813d3). ","permalink":"https://playground.christian-gmeiner.info/2014-03-17-qtcreator-ptrace-operation-not-permitted/","summary":"\u003cp\u003eToday I wanted to debug a Qt based application within QtCreator but failed. After a quick google I found the solution:\u003c/p\u003e\n\u003cdiv class=\"oembed-gist\"\u003e\u003cscript src=\"https://gist.github.com/austriancoder/c2733a5ca5cfa9c23fe99c27811813d3.js\"\u003e\u003c/script\u003e\u003cnoscript\u003eView the code on [Gist](https://gist.github.com/austriancoder/c2733a5ca5cfa9c23fe99c27811813d3).\u003c/noscript\u003e\u003c/div\u003e","title":"QtCreator: ptrace operation not permitted"},{"content":"I did spend some time to find the cause for the rendering issues during running some egls2 demos. The fix is a simple one-liner and I would say that GC8xx and GC2000 are ‘equal’ now. That means general work on etnaviv can start now. Currently I am looking in different problem zones and where to start.\nUpdate mesa fork Start working on an improved compiler Start working on an kernel interface I think that Rob will start soon on the kernel interface and the mesa update should be doable during some hours. So I think the next big and important step is to improve the compiler. What should I say… I have basic compiler understanding, did wrote a compiler and VM during my study… thats it. I have never written a single line of glsl and I do not completely understand the Vivante GPU. So a perfect starting point for doing some hacking 🙂 The success rate will be quite low and I hope to not lose my motivation too soon.\n","permalink":"https://playground.christian-gmeiner.info/2014-02-22-the-next-steps-for-etnaviv/","summary":"\u003cp\u003eI did spend some time to find the cause for the rendering issues during running some egls2 demos. The fix is a simple one-liner and I would say that GC8xx and GC2000 are ‘equal’ now. That means general work on etnaviv can start now. Currently I am looking in different problem zones and where to start.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eUpdate mesa fork\u003c/li\u003e\n\u003cli\u003eStart working on an improved compiler\u003c/li\u003e\n\u003cli\u003eStart working on an kernel interface\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eI think that Rob will start soon on the kernel interface and the mesa update should be doable during some hours. So I think the next big and important step is to improve the compiler. What should I say… I have basic compiler understanding, did wrote a compiler and VM during my study… thats it. I have never written a single line of glsl and I do not completely understand the Vivante GPU. So a perfect starting point for doing some hacking 🙂 The success rate will be quite low and I hope to not lose my motivation too soon.\u003c/p\u003e","title":"The next steps for etnaviv"},{"content":"Sometimes I can be useful to download a changes contained in a Github pull request as a unified diff. It turns out to be very easy. To view a commit as a diff/patch file, just add .diff or .patch to the end of the URL\nFor instance ","permalink":"https://playground.christian-gmeiner.info/2014-02-20-github-how-to-download-a-change-as-patch/","summary":"\u003cp\u003eSometimes I can be useful to download a changes contained in a Github pull request as a unified diff. It turns out to be very easy.  To view a commit as a diff/patch file, just add \u003ccode\u003e.diff\u003c/code\u003e or \u003ccode\u003e.patch\u003c/code\u003e to the end of the URL\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/austriancoder/etna_viv/commit/568d290514b6e61428bb73281ac596b0404c8f70.patch\"\u003eFor instance\u003c/a\u003e \u003ca href=\"https://github.com/austriancoder/etna_viv/commit/568d290514b6e61428bb73281ac596b0404c8f70.patch\"\u003e\n\u003c/a\u003e\u003c/p\u003e","title":"GitHub: How to download a change as patch"},{"content":"Here is the first result of running mesatest_gles on mesa\u0026amp;etna:\nFollowing tests are showing good visual results compared to swrast:\nHello_Triangle/CH02_HelloTriangle Simple_VertexShader/CH08_SimpleVertexShader CubeVBO/cube_vbo ParticleSystem/CH13_ParticleSystem Viewports/viewports All other are visual corrupted or segfault. So there is still some work done to get all demos up and running.\n","permalink":"https://playground.christian-gmeiner.info/2014-02-15-mesa-meets-gc2000/","summary":"\u003cp\u003eHere is the first result of running \u003ca href=\"https://github.com/laanwj/mesatest_gles\"\u003emesatest_gles \u003c/a\u003eon \u003ca href=\"https://github.com/austriancoder/mesa\"\u003emesa\u0026amp;etna\u003c/a\u003e:\u003c/p\u003e\n\u003cp\u003eFollowing tests are showing good visual results compared to swrast:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHello_Triangle/CH02_HelloTriangle\u003c/li\u003e\n\u003cli\u003eSimple_VertexShader/CH08_SimpleVertexShader\u003c/li\u003e\n\u003cli\u003eCubeVBO/cube_vbo\u003c/li\u003e\n\u003cli\u003eParticleSystem/CH13_ParticleSystem\u003c/li\u003e\n\u003cli\u003eViewports/viewports\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll other are visual corrupted or segfault. So there is still some work done to get all demos\nup and running.\u003c/p\u003e","title":"Mesa meets GC2000"},{"content":"Today I hit an important milestone for etnaviv – an open source user-space driver for the Vivante GCxxx series of embedded GPUs. I finally got GC2000 support to a level that it seems to work. It took me some months to get there. At the beginning it sounds easy to rebuild a ‘driver’ if you get readable command buffer dumps. I did start with working on a simple replay program to render a cube in the same was as the binary blob does it. But what should I say… it is quite boring to do everything by hand and not taking advantage of libetnaviv and the ‘driver’ at all. So I decided to go the hard way and try to fix/add all missing bits until it renders something. The good thing is that I have now some knowledge about the structure of libetnaviv, the dirver and mesa in general. It helps a lot if you know why stuff is done that way.\nAlso this is my first reverse engineering project I contributed to and even I have never done any graphics related stuff – okay I did some OpenGL stuff during my studies.\nI try to find some more time to help to create a fully open source graphics stack for Vivante GPUs.\nIf have not seen it yet: Here is a short video showing the current state of etnaviv on a iMX6q (Sabre Lite). Video in Google+ post\n","permalink":"https://playground.christian-gmeiner.info/2014-02-09-gc2000-support-for-etnaviv/","summary":"\u003cp\u003eToday I hit an important milestone for etnaviv – an open source user-space driver for the Vivante GCxxx series of embedded GPUs.\nI finally got GC2000 support to a level that it seems to work. It took me some months to get there.\nAt the beginning it sounds easy to rebuild a ‘driver’ if you get readable command buffer dumps. I did start with working on a simple replay program to render a cube in the same was as the binary blob does it.\nBut what should I say… it is quite boring to do everything by hand and not taking advantage of libetnaviv\nand the ‘driver’ at all. So I decided to go the hard way and try to fix/add all missing bits until it renders something.\nThe good thing is that I have now some knowledge about the structure of libetnaviv, the\ndirver and mesa in general. It helps a lot if you know why stuff is done that way.\u003c/p\u003e","title":"GC2000 support for etnaviv"},{"content":"Today I needed to rebase my etnaviv fork to the current master of upstream. I need to say that I never did this before but with git this is a breeze.\nView the code on [Gist](https://gist.github.com/austriancoder/724a0a8d1db4f229e197d501f8b49fa5).If you get a merge conflict during rebase, you only need to follow the instructions git gives you. ","permalink":"https://playground.christian-gmeiner.info/2014-02-08-rebase-github-fork/","summary":"\u003cp\u003eToday I needed to rebase my etnaviv fork to the current master of upstream. I need to say that\nI never did this before but with git this is a breeze.\u003c/p\u003e\n\u003cdiv class=\"oembed-gist\"\u003e\u003cscript src=\"https://gist.github.com/austriancoder/724a0a8d1db4f229e197d501f8b49fa5.js\"\u003e\u003c/script\u003e\u003cnoscript\u003eView the code on [Gist](https://gist.github.com/austriancoder/724a0a8d1db4f229e197d501f8b49fa5).\u003c/noscript\u003e\u003c/div\u003eIf you get a merge conflict during rebase, you only need to follow the instructions git gives you.","title":"Rebase Github fork"},{"content":"I am using cmake during my job to create Debian installation packages for different kind of software projects. Today I run into an issue. I needed to run some post installation steps. I know that this is quite easy possible within a deb file, but how to archive the same with cmake?\nIt turned out to be quite easy:\nView the code on [Gist](https://gist.github.com/austriancoder/1c3ba1d383fefbf8dd7fe773cebd882d).Where postinst is the script which gets executed after the deb got installed. ","permalink":"https://playground.christian-gmeiner.info/2014-01-23-cmake-post-install-scripts-for-debian/","summary":"\u003cp\u003eI am using cmake during my job to create Debian installation packages for different kind of software projects. Today I run into an issue. I needed to run some post installation steps. I know that this is quite easy possible within a deb file, but how to archive the same with cmake?\u003c/p\u003e\n\u003cp\u003eIt turned out to be quite easy:\u003c/p\u003e\n\u003cdiv class=\"oembed-gist\"\u003e\u003cscript src=\"https://gist.github.com/austriancoder/1c3ba1d383fefbf8dd7fe773cebd882d.js\"\u003e\u003c/script\u003e\u003cnoscript\u003eView the code on [Gist](https://gist.github.com/austriancoder/1c3ba1d383fefbf8dd7fe773cebd882d).\u003c/noscript\u003e\u003c/div\u003eWhere postinst is the script which gets executed after the deb got installed.","title":"CMake: Post install scripts for debian"},{"content":"You may know this situation: You have seen a shell command, looked in the man page but you are no really sure what it does?\nIt solution to this problem is quite easy: http://explainshell.com/\nThe best thing is that the source code is released under GPL and can be found at GitHub\n","permalink":"https://playground.christian-gmeiner.info/2013-09-05-decrypt-shell-commands/","summary":"\u003cp\u003eYou may know this situation: You have seen a shell command, looked in the man page but you are no really sure what it does?\u003c/p\u003e\n\u003cp\u003eIt solution to this problem is quite easy: \u003ca href=\"http://explainshell.com/\" title=\"http://explainshell.com/\"\u003ehttp://explainshell.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/09/explainshell1.png\"\u003e\u003cimg alt=\"explainshell\" loading=\"lazy\" src=\"/wp-content/uploads/2013/09/explainshell1-1024x721.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe best thing is that the source code is released under GPL and can be found at \u003ca href=\"https://github.com/idank/explainshell\"\u003eGitHub\u003c/a\u003e\u003c/p\u003e","title":"Decrypt shell commands"},{"content":"Sometimes it is needed to recreate the used ssh host keys and this can be done quite easy on a Debian based system.\nView the code on [Gist](https://gist.github.com/austriancoder/65c4f0141bdea7f565c1aed21404fd19). ","permalink":"https://playground.christian-gmeiner.info/2013-08-22-recreate-ssh-host-keys-in-debian/","summary":"\u003cp\u003eSometimes it is needed to recreate the used ssh host keys and this can be done quite easy on a Debian based system.\u003c/p\u003e\n\u003cdiv class=\"oembed-gist\"\u003e\u003cscript src=\"https://gist.github.com/austriancoder/65c4f0141bdea7f565c1aed21404fd19.js\"\u003e\u003c/script\u003e\u003cnoscript\u003eView the code on [Gist](https://gist.github.com/austriancoder/65c4f0141bdea7f565c1aed21404fd19).\u003c/noscript\u003e\u003c/div\u003e","title":"Recreate ssh host keys in Debian"},{"content":"On my work linux machine I am using Ubuntu with KDE. As the new 4.11 was released I thought it would be a good idea to update my current KDE installation. As a long-term Gentoo user it needed some more steps.\nsudo add-apt-repository ppa:kubuntu-ppa/backports sudo apt-get update sudo apt-get dist-upgrade\nI think it is really time to replace my Ubuntu installation with something different/better.\n","permalink":"https://playground.christian-gmeiner.info/2013-08-21-update-kde-in-ubuntu/","summary":"\u003cp\u003eOn my work linux machine I am using Ubuntu with KDE. As the new 4.11 was released I thought it would be a good idea to update my current KDE installation. As a long-term Gentoo user it needed some more steps.\u003c/p\u003e\n\u003cp\u003esudo add-apt-repository ppa:kubuntu-ppa/backports sudo apt-get update sudo apt-get dist-upgrade\u003c/p\u003e\n\u003cp\u003eI think it is really time to replace my Ubuntu installation with something different/better.\u003c/p\u003e","title":"Update KDE in Ubuntu"},{"content":"The company I work for has designed a custom i.MX6 based board and I am the guy who does the board bring-up. For me the i.MX6 platform is a very good choice as support for the hardware in u-boot and the linux kernel is quite good. So it should not be too hard to get linux running on our custom board.\nBut wait… as I learned from my coreboot activities – memory setup is the hardest and most importest part. The custom board has 1GB of DDR3 on it and I started to look how u-boot does the DDR setup. And there I read the term DCD – Device Configuration Data.\nDCD does contain the init sequence for DDR3 and I had to look up some stuff in the “i.MX 6Dual/6Quad Applications Processor Reference Manual” to find out that this must be some kind of black magic. I tried my luck with the DDR3 Stress Tester from Freescale and failed. It was so hard to get all those register correct if you do not know much about DDR3 at all.\nLuckily I got a hint that in the Freescale commuity is something which could help me – thanks Fabio. It turns out to be an Excel sheet where I filled in few values and got a DDR3 init script for the DDR3 Stress Tester.\n10 Minutes after I got the Excel sheet into my hands it looks like I got the memory up and running – nice!\nThe “magic” Excel sheet can be found here.\n","permalink":"https://playground.christian-gmeiner.info/2013-07-26-i-mx6-ddr3-setup/","summary":"\u003cp\u003eThe company I work for has designed a custom i.MX6 based board and I am the guy who\ndoes the board bring-up. For me the i.MX6 platform is a very good choice as support\nfor the hardware in u-boot and the linux kernel is quite good. So it should not be\ntoo hard to get linux running on our custom board.\u003c/p\u003e\n\u003cp\u003eBut wait… as I learned from my coreboot activities – memory setup is the hardest\nand most importest part. The custom board has 1GB of DDR3 on it and I started to look\nhow u-boot does the DDR setup. And there I read the term DCD – Device Configuration Data.\u003c/p\u003e","title":"i.MX6 - DDR3 setup"},{"content":"In some rare cases I need to debug some networking protocols and my target of interest is NTP. I am debugging an issue where (maybe) NTP sets the current time backwards about two hours. My first candidate to look deeper is ntpd.\nBut what do I see… debugging option is disabled in the Debian squeeze package of ntp. WTF?! – the only nice way to do useful debugging without wireshark. The good thing is that Ubuntu had the same miss-configuration and got it fixed.\nSo I only need to rebuild the ntpd package with debugging enabled.\nsudo apt-get build-dep ntpd sudo apt-get source ntpd cd ntp-4.2.6.p2+dfsg nano debian/rules dpkg-buildpackage -rfakeroot -uc -b The result is a deb in the parent folder.\n","permalink":"https://playground.christian-gmeiner.info/2013-06-12-rebuild-a-debian-package-from-source/","summary":"\u003cp\u003eIn some rare cases I need to debug some networking protocols and my target of interest\nis NTP. I am debugging an issue where (maybe) NTP sets the current time backwards about\ntwo hours. My first candidate to look deeper is ntpd.\u003c/p\u003e\n\u003cp\u003eBut what do I see… debugging option is disabled in the Debian squeeze package of ntp.\nWTF?! – the only nice way to do useful debugging without wireshark. The good thing is\nthat Ubuntu had the same miss-configuration and got it \u003ca href=\"https://bugs.launchpad.net/ubuntu/+source/ntp/+bug/47683\"\u003efixed\u003c/a\u003e.\u003c/p\u003e","title":"Rebuild a Debian package from source"},{"content":"At the moment I am playing around with a cute nice little imx6q board – the sabre lite.\nI am running a freescale based RFS with the binary libGAL.so blob in the user space. So why not look into etna_viv and get it compiled. It turns out to be as simple as this.\ngit clone git://github.com/laanwj/etna_viv.git cd etna_viv/native export GCABI=imx6 export CFLAGS=\u0026quot;-D_POSIX_C_SOURCE=200809 -D_GNU_SOURCE -DLINUX -pthread\u0026quot; export CXXFLAGS=\u0026quot;-D_POSIX_C_SOURCE=200809 -D_GNU_SOURCE -DLINUX -pthread\u0026quot; make\nAt the moment the GC2000 support is non existent but it should be possible to add support for it in the foreseeable future. To get a picture what needs to be done have a lookt at https://blog.visucore.com/2013/3/3/gc2000-vs-gc800\n","permalink":"https://playground.christian-gmeiner.info/2013-04-29-building-etna_viv-on-the-sabre-lite/","summary":"\u003cp\u003eAt the moment I am playing around with a cute nice little imx6q board – \u003ca href=\"http://boundarydevices.com/products/sabre-lite-imx6-sbc/\"\u003ethe sabre lite\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI am running a freescale based RFS with the binary libGAL.so blob in the user space. So why\nnot look into etna_viv and get it compiled. It turns out to be as simple as this.\u003c/p\u003e\n\u003cp\u003egit clone git://github.com/laanwj/etna_viv.git cd etna_viv/native export GCABI=imx6 export CFLAGS=\u0026quot;-D_POSIX_C_SOURCE=200809 -D_GNU_SOURCE -DLINUX -pthread\u0026quot; export CXXFLAGS=\u0026quot;-D_POSIX_C_SOURCE=200809 -D_GNU_SOURCE -DLINUX -pthread\u0026quot; make\u003c/p\u003e","title":"Building etna_viv on the sabre lite"},{"content":"Image you are working on a small web application where you use a JQuery UI dialog to inform the user about the current process.\nTriggered via SSE I am appending some messages via JavaScript.\n$(\u0026rsquo;#progress\u0026rsquo;).append(\u0026quot;\u0026lt;span class=\u0026lsquo;ui-icon ui-icon-alert\u0026rsquo; style=\u0026lsquo;float: left; margin-right: .3em\u0026rsquo;;\u0026gt;\u0026quot; + stderr + \u0026ldquo;\n\u0026rdquo;);\nIn order to automaticly scroll to the last line I am using this two magic lines of JavaScript:\nvar height = $(\u0026rsquo;#progress\u0026rsquo;)[0].scrollHeight; $(\u0026rsquo;#progress\u0026rsquo;).scrollTop(height);\nIt is simple as that.\n","permalink":"https://playground.christian-gmeiner.info/2013-03-16-jquery-autoscroll-to-last-line-of-a-div/","summary":"\u003cp\u003eImage you are working on a small web application where you use a JQuery UI dialog\nto inform the user about the current process.\u003c/p\u003e\n \u003cul id=\"progress\" style=\"width: 300px; height: 200px; overflow: auto\"\u003e \u003c/ul\u003e\n\u003cp\u003eTriggered via SSE I am appending some messages via JavaScript.\u003c/p\u003e\n\u003cp\u003e$(\u0026rsquo;#progress\u0026rsquo;).append(\u0026quot;\u0026lt;span class=\u0026lsquo;ui-icon ui-icon-alert\u0026rsquo; style=\u0026lsquo;float: left; margin-right: .3em\u0026rsquo;;\u0026gt;\u003c/span\u003e\u0026quot; + stderr + \u0026ldquo;\u003cbr\u003e\u0026rdquo;);\u003c/p\u003e\n\u003cp\u003eIn order to automaticly scroll to the last line I am using this two magic lines of JavaScript:\u003c/p\u003e\n\u003cp\u003evar height = $(\u0026rsquo;#progress\u0026rsquo;)[0].scrollHeight; $(\u0026rsquo;#progress\u0026rsquo;).scrollTop(height);\u003c/p\u003e","title":"JQuery: autoscroll to last line of a div"},{"content":"git clone http://review.coreboot.org/p/coreboot.git coreboot Cloning into \u0026lsquo;coreboot\u0026rsquo;\u0026hellip; error: RPC failed; result=22, HTTP code = 504 fatal: The remote end hung up unexpectedly\nThe error occurs in ‘libcurl’, which is the underlying protocol for http. To get more details about the error, set GIT_CURL_VERBOSE=1\n","permalink":"https://playground.christian-gmeiner.info/2013-03-07-git-rpc-failed/","summary":"\u003cp\u003egit clone \u003ca href=\"http://review.coreboot.org/p/coreboot.git\"\u003ehttp://review.coreboot.org/p/coreboot.git\u003c/a\u003e coreboot Cloning into \u0026lsquo;coreboot\u0026rsquo;\u0026hellip; error: RPC failed; result=22, HTTP code = 504 fatal: The remote end hung up unexpectedly\u003c/p\u003e\n\u003cp\u003eThe error occurs in ‘libcurl’, which is the underlying protocol for http. To get more details about the error, set GIT_CURL_VERBOSE=1\u003c/p\u003e","title":"git: RPC failed; result=22, HTTP code = 504"},{"content":"Some naive guys – like me – think that SMBus and I²C are equal expect the bus level. But in the last days I run into a problem where an at24 based EEPROM connected via SMBus triggers a bus collision after a warm reboot. After some hours of debugging – even staring minutes at a oscilloscope showing SDD and SDC lines – I started to add some dump_stack() calls into i2c_core.c file form a recent linux kernel. And I found the bad bus transaction – i2c_probe_func_quick_read(..).\nBut whats exactly the problem here?\nThe SMBus specification describes a number of standardized transactions. Each chip on the bus can support each given transaction type or not. In practice, each slave chip only supports a subset of the SMBus specification. The Linux i2c subsystem abuses this transaction type for device detection purposes, because it is known to give good results in practice, but ideally it shouldn’t do that.\nThere have been some devices known to lock up the SMBus on Quick command with data bit = 1. In most cases these were write-only devices, which didn’t expect a transaction starting like a read (the SMBus specification says that a Quick command with data bit = 1 is writing 1 bit to the slave, but the I2C specification says this is a read transaction of length 0.)\nThis SMBus Quick command thing keeps causing trouble and confusing people. Not much we can do though. If your slaves don’t like the quick command, just don’t send that command to them.\nSMBus quick command problem\nThe solution is quite simple: use i2c_new_probed_device(..) function for probing devices on the SMBus/I²C-Bus. By the way I have found a nice comparison from TI: SMBus vs. I²C\n","permalink":"https://playground.christian-gmeiner.info/2013-02-23-smbus-compatibility-with-an-i-c2-b2c-device/","summary":"\u003cp\u003eSome naive guys – like me – think that SMBus and I²C are equal expect the bus level. But in the last days I run into a problem where an at24 based EEPROM connected via SMBus triggers a bus collision after a warm reboot. After some hours of debugging – even staring minutes at a oscilloscope showing SDD and SDC lines – I started to add some dump_stack() calls into i2c_core.c file form a recent linux kernel. And I found the bad bus transaction – i2c_probe_func_quick_read(..).\u003c/p\u003e","title":"SMBus Compatibility With an I²C Device"},{"content":"At the moment I am reworking some old seabios patches as I want them in upstream. At the moment my git log shows this:\ncommit fd7e6128d5fb9b8297a4a20f3288c130a554147b Author: Christian Gmeiner christian.gmeiner@gmail.com Date: Thu Feb 14 10:24:59 2013 +0100 geodevga: fix wrong define name Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com commit b1268e8100f0bcf0655b65326856e6f33e3625c1 Author: Christian Gmeiner christian.gmeiner@gmail.com Date: Thu Feb 14 10:22:58 2013 +0100 geodevga: add debug to msr functions Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com commit dde4df84126a460c454ca79fc8dc5b0ae4aa876e Author: Christian Gmeiner christian.gmeiner@gmail.com Date: Thu Feb 14 10:19:05 2013 +0100 geodevga: move output setup to own function Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com commit bba85a38c67aa2b52f146b5cefe58b00f516fc2e Author: Christian Gmeiner christian.gmeiner@gmail.com Date: Thu Feb 14 10:13:59 2013 +0100 geodevga: move framebuffer setup Framebuffer setup has nothing to do with dc_setup(..) so move it to geodevga_init(..). Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com commit 0b3dee01385e65f2b88600c9b663589343ac4abe Author: Christian Gmeiner christian.gmeiner@gmail.com Date: Thu Feb 14 10:05:45 2013 +0100 geodevga: fix errors in geode_fp_* functions Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com commit 4b1d2be6e1c73d1fc9a984ca7fe6c14d433171cc Author: David Woodhouse David.Woodhouse@intel.com Date: Sun Feb 10 00:51:56 2013 +0000 Unify return path for CSM to go via csm_return() This allows us to keep the entry_csm code simple, and ensures that we consistently do things like saving the PIC mask (and later setting UmbStart) on the way back to UEFI. \u0026hellip;\nThe first step is to generate the patches.\n$ git format-patch -M origin/master 0001-geodevga-fix-errors-in-geode_fp_-functions.patch 0002-geodevga-move-framebuffer-setup.patch 0003-geodevga-move-output-setup-to-own-function.patch 0004-geodevga-add-debug-to-msr-functions.patch 0005-geodevga-fix-wrong-define-name.patch\nNow we simply need to send them via mail – git helps here too 🙂\n$ git send-email .patch 0001-geodevga-fix-errors-in-geode_fp_-functions.patch 0001-geodevga-fix-wrong-define-name.patch 0002-geodevga-move-framebuffer-setup.patch 0003-geodevga-move-output-setup-to-own-function.patch 0004-geodevga-add-debug-to-msr-functions.patch 0005-geodevga-fix-wrong-define-name.patch Who should the emails appear to be from? [Christian Gmeiner christian.gmeiner@gmail.com] Emails will be sent from: Christian Gmeiner christian.gmeiner@gmail.com Who should the emails be sent to (if any)? seabios@seabios.org Message-ID to be used as In-Reply-To for the first email (if any)? (mbox) Adding cc: Christian Gmeiner christian.gmeiner@gmail.com from line \u0026lsquo;From: Christian Gmeiner christian.gmeiner@gmail.com\u0026rsquo; (body) Adding cc: Christian Gmeiner christian.gmeiner@gmail.com from line \u0026lsquo;Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com\u0026rsquo; From: Christian Gmeiner christian.gmeiner@gmail.com To: seabios@seabios.org Cc: Christian Gmeiner christian.gmeiner@gmail.com Subject: [PATCH 1/5] geodevga: fix errors in geode_fp_ functions Date: Thu, 14 Feb 2013 10:34:32 +0100 Message-Id: 1360834477-18802-1-git-send-email-christian.gmeiner@gmail.com X-Mailer: git-send-email 1.7.12.2.421.g261b511 The Cc list above has been expanded by additional addresses found in the patch commit message. By default send-email prompts before sending whenever this occurs. This behavior is controlled by the sendemail.confirm configuration setting. For additional information, run \u0026lsquo;git send-email \u0026ndash;help\u0026rsquo;. To retain the current behavior, but squelch this message, run \u0026lsquo;git config \u0026ndash;global sendemail.confirm auto\u0026rsquo;. Send this email? ([y]es|[n]o|[q]uit|[a]ll): a OK. Log says: Server: smtp.gmail.com MAIL FROM:christian.gmeiner@gmail.com RCPT TO:seabios@seabios.org RCPT TO:christian.gmeiner@gmail.com From: Christian Gmeiner christian.gmeiner@gmail.com To: seabios@seabios.org Cc: Christian Gmeiner christian.gmeiner@gmail.com Subject: [PATCH 1/5] geodevga: fix errors in geode_fp_* functions Date: Thu, 14 Feb 2013 10:34:32 +0100 Message-Id: 1360834477-18802-1-git-send-email-christian.gmeiner@gmail.com X-Mailer: git-send-email 1.7.12.2.421.g261b511 Result: 250 2.0.0 OK 1360833086 q5sm77386411eep.11 - gsmtp \u0026hellip; \u0026hellip;\n","permalink":"https://playground.christian-gmeiner.info/2013-02-15-sending-patches-from-a-local-git-repository/","summary":"\u003cp\u003eAt the moment I am reworking some old seabios patches as I want them in upstream. At the moment my git log shows this:\u003c/p\u003e\n\u003cp\u003ecommit fd7e6128d5fb9b8297a4a20f3288c130a554147b Author: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e Date: Thu Feb 14 10:24:59 2013 +0100 geodevga: fix wrong define name Signed-off-by: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e commit b1268e8100f0bcf0655b65326856e6f33e3625c1 Author: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e Date: Thu Feb 14 10:22:58 2013 +0100 geodevga: add debug to msr functions Signed-off-by: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e commit dde4df84126a460c454ca79fc8dc5b0ae4aa876e Author: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e Date: Thu Feb 14 10:19:05 2013 +0100 geodevga: move output setup to own function Signed-off-by: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e commit bba85a38c67aa2b52f146b5cefe58b00f516fc2e Author: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e Date: Thu Feb 14 10:13:59 2013 +0100 geodevga: move framebuffer setup Framebuffer setup has nothing to do with dc_setup(..) so move it to geodevga_init(..). Signed-off-by: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e commit 0b3dee01385e65f2b88600c9b663589343ac4abe Author: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e Date: Thu Feb 14 10:05:45 2013 +0100 geodevga: fix errors in geode_fp_* functions Signed-off-by: Christian Gmeiner \u003ca href=\"mailto:christian.gmeiner@gmail.com\"\u003echristian.gmeiner@gmail.com\u003c/a\u003e commit 4b1d2be6e1c73d1fc9a984ca7fe6c14d433171cc Author: David Woodhouse \u003ca href=\"mailto:David.Woodhouse@intel.com\"\u003eDavid.Woodhouse@intel.com\u003c/a\u003e Date: Sun Feb 10 00:51:56 2013 +0000 Unify return path for CSM to go via csm_return() This allows us to keep the entry_csm code simple, and ensures that we consistently do things like saving the PIC mask (and later setting UmbStart) on the way back to UEFI. \u0026hellip;\u003c/p\u003e","title":"Sending patches from a local git repository"},{"content":"Today is February 14. Some think of it as flower grocer appreciation day, but most (and for better reasons) celebrate it as the international I ♥ Free Software day.\nFree and open source software makes it possible to fix problems and/or implement new features in software I use. I could write a lot of text why I think it is a good idea to support the open source community but I want you to form an opinion about this topic buy simply using open source software and support it. It does not mean you need to send in some patches… it starts with simple things like bug reports or user support.\n","permalink":"https://playground.christian-gmeiner.info/2013-02-14-i-love-free-software/","summary":"\u003cp\u003eToday is February 14. Some think of it as flower grocer appreciation day, but most (and for better reasons) celebrate it as the international \u003ca href=\"http://fsfe.org/campaigns/ilovefs/2013/ilovefs.en.html\"\u003eI ♥ Free Software day\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/02/valentine-2010.png\"\u003e\u003cimg alt=\"valentine-2010\" loading=\"lazy\" src=\"/wp-content/uploads/2013/02/valentine-2010.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFree and open source software makes it possible to fix problems and/or implement new features in software I use. I could write a lot of text why I think it is a good idea to support the open source community but I want you to form an opinion about this topic buy simply using open source software and support it. It does not mean you need to send in some patches… it starts with simple things like bug reports or user support.\u003c/p\u003e","title":"I ♥ Free Software"},{"content":"In some rare cases I need to find the correct colors that can ‘work’ together. As I do not call me the graphical/designer guy I always use little helpers.\nhttp://colorschemedesigner.com\n","permalink":"https://playground.christian-gmeiner.info/2013-02-12-which-colors-can-work-together/","summary":"\u003cp\u003eIn some rare cases I need to find the correct colors that can ‘work’ together. As I do not call me the graphical/designer guy I always use little helpers.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://colorschemedesigner.com/\"\u003ehttp://colorschemedesigner.com\u003c/a\u003e\u003c/p\u003e","title":"Which colors can work together?"},{"content":"Sometimes if you are doing some fancy HTML5 development you wonder what jQuery selector would do the job. In such a case I can recommend the following little helper 🙂\nhttp://codylindley.com/jqueryselectors/\n","permalink":"https://playground.christian-gmeiner.info/2013-02-05-the-choice-of-jquery-selectors/","summary":"\u003cp\u003eSometimes if you are doing some fancy HTML5 development you wonder what jQuery selector\nwould do the job. In such a case I can recommend the following little helper 🙂\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://codylindley.com/jqueryselectors/\" title=\"Selectors\"\u003ehttp://codylindley.com/jqueryselectors/\u003c/a\u003e\u003c/p\u003e","title":"The choice of jQuery selector's"},{"content":"Sometimes it is needed to add some vendor specific information’s like a version string to a generated coreboot rom. For this example we assume we want the area from 0x00 to 0x30 for such kind of data.\nThe first idea is to use cbfstool. Thanks to some guys in the IRC channel it looks like the current build system does something like:\ncbfstool -o $$(( $(CONFIG_ROM_SIZE) - $(CONFIG_CBFS_SIZE) )) \u0026hellip;\nSo all we need is to change CBFS_SIZE to ROM_SIZE – 0x30 in .config file.\n\u0026hellip; CONFIG_CONSOLE_SERIAL8250=y # CONFIG_USBDEBUG is not set # CONFIG_K8_REV_F_SUPPORT is not set CONFIG_CPU_ADDR_BITS=32 CONFIG_BOARD_ROMSIZE_KB_2048=y # CONFIG_COREBOOT_ROMSIZE_KB_64 is not set # CONFIG_COREBOOT_ROMSIZE_KB_128 is not set # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set \u0026hellip; CONFIG_CORE_GLIU_500_266=y CONFIG_PLLMSRhi=0x39c # CONFIG_NORTHBRIDGE_AMD_AGESA is not set # CONFIG_AMD_NB_CIMX is not set # CONFIG_NORTHBRIDGE_AMD_CIMX_RD890 is not set CONFIG_CBFS_SIZE=0x1FFFD0 # # Southbridge # CONFIG_SOUTHBRIDGE_AMD_CS5536=y \u0026hellip;\nThis results in the wanted result:\n\u0026hellip; coreboot.rom: 2048 kB, bootblocksize 688, romsize 2097152, offset 0x30 alignment: 64 bytes, architecture: x86 Name Offset Type Size vsa 0x30 stage 55124 config 0xd7c0 raw 2810 (empty) 0xe300 null 7256 fallback/romstage 0xff80 stage 19339 fallback/coreboot_ram 0x14b80 stage 38852 fallback/payload 0x1e380 payload 21831 (empty) 0x23900 null 1950728\nAnd here the file based prove:\nhexedit build/coreboot.rom 00000000 FF FF FF FF FF FF FF FF \u0026hellip;\u0026hellip;.. 00000008 FF FF FF FF FF FF FF FF \u0026hellip;\u0026hellip;.. 00000010 FF FF FF FF FF FF FF FF \u0026hellip;\u0026hellip;.. 00000018 FF FF FF FF FF FF FF FF \u0026hellip;\u0026hellip;.. 00000020 FF FF FF FF FF FF FF FF \u0026hellip;\u0026hellip;.. 00000028 FF FF FF FF FF FF FF FF \u0026hellip;\u0026hellip;.. 00000030 4C 41 52 43 48 49 56 45 LARCHIVE 00000038 00 00 D7 54 00 00 00 10 \u0026hellip;T\u0026hellip;. 00000040 00 00 00 00 00 00 00 28 \u0026hellip;\u0026hellip;.( ","permalink":"https://playground.christian-gmeiner.info/2013-02-05-add-vendor-specific-informations-to-a-coreboot-rom/","summary":"\u003cp\u003eSometimes it is needed to add some vendor specific information’s like a version string\nto a generated coreboot rom. For this example we assume we want the area from 0x00 to 0x30\nfor such kind of data.\u003c/p\u003e\n\u003cp\u003eThe first idea is to use cbfstool. Thanks to some guys in the IRC channel it looks like the\ncurrent build system does something like:\u003c/p\u003e\n\u003cp\u003ecbfstool -o $$(( $(CONFIG_ROM_SIZE) - $(CONFIG_CBFS_SIZE) )) \u0026hellip;\u003c/p\u003e","title":"Add vendor specific information's to a coreboot rom"},{"content":"I am looking for a way to detect If a initramfs was used during boot. And after some reboots and reading of init script of initramfs-tools I found this solution.\n#!/bin/bash if [ -e /dev/.initramfs ]; then echo YES else echo NO fi\nThis may not work under wheezy or any other working distribution. But that’s okay for now 🙂\n","permalink":"https://playground.christian-gmeiner.info/2013-02-04-detect-initramfs-under-debian-squeeze/","summary":"\u003cp\u003eI am looking for a way to detect If a initramfs was used during boot. And after some reboots\nand reading of init script of initramfs-tools I found this solution.\u003c/p\u003e\n\u003cp\u003e#!/bin/bash if [ -e /dev/.initramfs ]; then echo YES else echo NO fi\u003c/p\u003e\n\u003cp\u003eThis may not work under wheezy or any other working distribution. But that’s okay for now 🙂\u003c/p\u003e","title":"Detect initramfs under Debian squeeze"},{"content":"I always wanted to try out systemd as I like the ideas and concept behind it. So lets get started:\nadd systemd USE-flag emerge –ask –changed-use –deep @world emerge –ask systemd change grub config to use init=/usr/bin/systemd reboot localhost christian # systemd-analyze Traceback (most recent call last): File \u0026ldquo;/usr/bin/systemd-analyze\u0026rdquo;, line 23, in from gi.repository import Gio ImportError: No module named gi.repository\nThis can be fixed with:\nemerge -av dev-python/pygobject Here are the first results:\nlocalhost christian # systemd-analyze Startup finished in 2352ms (kernel) + 90695ms (userspace) = 93048ms localhost christian # systemd-analyze blame 3567ms NetworkManager.service 1311ms systemd-logind.service 530ms tmp.mount 528ms systemd-udevd.service 519ms systemd-vconsole-setup.service 393ms systemd-udev-trigger.service 363ms polkit.service 352ms sys-kernel-debug.mount 338ms dev-mqueue.mount 321ms dev-hugepages.mount 300ms boot-efi.mount 222ms systemd-sysctl.service 149ms systemd-user-sessions.service 114ms systemd-tmpfiles-setup.service 88ms console-kit-log-system-start.service 73ms console-kit-daemon.service 49ms dev-sda1.swap 44ms upower.service 33ms systemd-remount-fs.service\nSo my system boots 🙂 Lets see what is left to replace openrc.\n","permalink":"https://playground.christian-gmeiner.info/2013-01-21-systemd-on-a-gentoo-based-system/","summary":"\u003cp\u003eI always wanted to try out systemd as I like the ideas and concept behind it. So lets get started:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan style=\"line-height: 15px;\"\u003eadd systemd USE-flag\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003eemerge –ask –changed-use –deep @world\u003c/li\u003e\n\u003cli\u003eemerge –ask systemd\u003c/li\u003e\n\u003cli\u003echange grub config to use init=/usr/bin/systemd\u003c/li\u003e\n\u003cli\u003ereboot\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003elocalhost christian # systemd-analyze Traceback (most recent call last): File \u0026ldquo;/usr/bin/systemd-analyze\u0026rdquo;, line 23, in \u003cmodule\u003e from gi.repository import Gio ImportError: No module named gi.repository\u003c/p\u003e\n\u003cp\u003eThis can be fixed with:\u003c/p\u003e\n\u003ch1 id=\"emerge--av-dev-pythonpygobject\"\u003eemerge -av dev-python/pygobject\u003c/h1\u003e\n\u003cp\u003eHere are the first results:\u003c/p\u003e","title":"systemd on a Gentoo based system"},{"content":"I run into a problem where I have a device which has two normal serial ports and some on a PCI device. After booting the kernel I got this error line:\nCouldn\u0026rsquo;t register serial port 0000:02:0a.2: -28\nIn order to get more than 2 serial ports working, I “fixed” my currently used kernel config:\nCONFIG_SERIAL_8250_NR_UARTS=32 CONFIG_SERIAL_8250_RUNTIME_UARTS=6\n","permalink":"https://playground.christian-gmeiner.info/2012-10-31-couldnt-register-serial-port-0000020a-2-28/","summary":"\u003cp\u003eI run into a problem where I have a device which has two normal serial ports and some on a PCI device.\nAfter booting the kernel I got this error line:\u003c/p\u003e\n\u003cp\u003eCouldn\u0026rsquo;t register serial port 0000:02:0a.2: -28\u003c/p\u003e\n\u003cp\u003eIn order to get more than 2 serial ports working, I “fixed” my currently used kernel config:\u003c/p\u003e\n\u003cp\u003eCONFIG_SERIAL_8250_NR_UARTS=32 CONFIG_SERIAL_8250_RUNTIME_UARTS=6\u003c/p\u003e","title":"Couldn't register serial port 0000:02:0a.2: -28"},{"content":"\n","permalink":"https://playground.christian-gmeiner.info/2012-10-22-petition-to-stop-software-patents-in-europe/","summary":"\u003cp\u003e\u003ca href=\"http://petition.stopsoftwarepatents.eu/521006897931/\"\u003e\u003cimg alt=\"stopsoftwarepatents.eu oetition banner\" loading=\"lazy\" src=\"http://petition.stopsoftwarepatents.eu/banner/521006897931/ssp-732-121.gif\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"Petition to stop software patents in Europe"},{"content":"If you already have Git installed, you can get the latest development version via Git itself:\ngit clone https://github.com/git/git.git\n","permalink":"https://playground.christian-gmeiner.info/2012-10-15-git-via-git/","summary":"\u003cp\u003eIf you already have Git installed, you can get the latest development version via Git itself:\u003c/p\u003e\n\u003cp\u003egit clone \u003ca href=\"https://github.com/git/git.git\"\u003ehttps://github.com/git/git.git\u003c/a\u003e\u003c/p\u003e","title":"Git via Git"},{"content":"Last days I run into a problem that I needed to change the mac address of a network card directly under linux. In the last years VxWorks was used for this purpose – oh and yes I know that you should not change a mac address 🙂 But I am working in a company which produces devices with network ports and they need an initial mac address.\nThe first thing you would try is to use ifconfig to change the mac address.\nifconfig eth0 hw ether xx:xx:xx:xx:xx:xx\nroot@OT:~# strace ifconfig eth0 hw ether 00:10:7e:02:52:b6 execve(\u0026quot;/sbin/ifconfig\u0026quot;, [\u0026ldquo;ifconfig\u0026rdquo;, \u0026ldquo;eth0\u0026rdquo;, \u0026ldquo;hw\u0026rdquo;, \u0026ldquo;ether\u0026rdquo;, \u0026ldquo;00:10:7e:02:52:b6\u0026rdquo;], [/* 11 vars */]) = 0 brk(0) = 0x943b000 access(\u0026quot;/etc/ld.so.nohwcap\u0026quot;, F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d0000 access(\u0026quot;/etc/ld.so.preload\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) open(\u0026quot;/etc/ld.so.cache\u0026quot;, O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=20075, \u0026hellip;}) = 0 mmap2(NULL, 20075, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb77cb000 close(3) = 0 access(\u0026quot;/etc/ld.so.nohwcap\u0026quot;, F_OK) = -1 ENOENT (No such file or directory) open(\u0026quot;/lib/libc.so.6\u0026quot;, O_RDONLY) = 3 read(3, \u0026ldquo;177ELF111\\0\\0\\0\\0\\0\\0\\0\\0\\03\\03\\01\\0\\0\\0360m1\\0004\\0\\0\\0\u0026rdquo;\u0026hellip;, 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1319176, \u0026hellip;}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77ca000 mmap2(NULL, 1329480, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7685000 mprotect(0xb77c3000, 4096, PROT_NONE) = 0 mmap2(0xb77c4000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13e) = 0xb77c4000 mmap2(0xb77c7000, 10568, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb77c7000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7684000 set_thread_area({entry_number:-1 -\u0026gt; 6, base_addr:0xb76846c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xb77c4000, 8192, PROT_READ) = 0 mprotect(0xb77ed000, 4096, PROT_READ) = 0 munmap(0xb77cb000, 20075) = 0 brk(0) = 0x943b000 brk(0x945c000) = 0x945c000 uname({sys=\u0026ldquo;Linux\u0026rdquo;, node=\u0026ldquo;OT\u0026rdquo;, \u0026hellip;}) = 0 access(\u0026quot;/proc/net\u0026quot;, R_OK) = 0 access(\u0026quot;/proc/net/unix\u0026quot;, R_OK) = 0 socket(PF_FILE, SOCK_DGRAM, 0) = 3 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4 access(\u0026quot;/proc/net/if_inet6\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/net/ax25\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/net/nr\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/net/rose\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/net/ipx\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/net/appletalk\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/sys/net/econet\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/sys/net/ash\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) access(\u0026quot;/proc/net/x25\u0026quot;, R_OK) = -1 ENOENT (No such file or directory) ioctl(4, SIOCSIFHWADDR, {ifr_name=\u0026ldquo;eth0\u0026rdquo;, ifr_hwaddr=00:10:7e:02:52:b6}) = 0 exit_group(0) = ?\nWhat this does is to change the mac address, but after a reboot this change is gone. So where is the mac address stored, you my ask. Normaly each NIC has an eeprom where some specific informations are stored like the mac address. And for linux there exists a nice tool to dump and change the contents of this eeproms – ethtool.\nroot@OT:~# ethtool -e eth0 Offset Values \u0026mdash;\u0026mdash; \u0026mdash;\u0026mdash; 0x0000 00 10 7e 01 fc 5b 00 00 00 00 01 03 01 47 00 00 0x0010 00 00 00 00 c0 49 01 00 00 00 70 00 00 00 00 00 0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0060 20 00 01 40 0a 41 00 00 00 00 00 00 00 00 00 00 0x0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e2 37\nroot@OT:~# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:10:7e:01:fc:5b inet addr:10.204.120.12 Bcast:10.204.127.255 Mask:255.255.192.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:812 errors:0 dropped:0 overruns:0 frame:0 TX packets:37 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:125002 (122.0 KiB) TX bytes:3195 (3.1 KiB)\nDid you see it? We found the place where our mac address is stored 🙂 Lets try to change the mac address directly in the eeprom.\nroot@OT:# ethtool -E eth0 magic 0x1234 offset 0x5 value 0x5c root@OT:# ethtool -e eth0 Offset Values \u0026mdash;\u0026mdash; \u0026mdash;\u0026mdash; 0x0000 00 10 7e 01 fc 5c 00 00 00 00 01 03 01 47 00 00 0x0010 00 00 00 00 c0 49 01 00 00 00 70 00 00 00 00 00 0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0060 20 00 01 40 0a 41 00 00 00 00 00 00 00 00 00 00 0x0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e2 36\nIn theory our new mac address should be available after an reboot.\nroot@OT:# reboot root@OT:# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:10:7e:01:fc:5c inet addr:10.204.120.12 Bcast:10.204.127.255 Mask:255.255.192.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:482 errors:0 dropped:0 overruns:0 frame:0 TX packets:7 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:32327 (31.5 KiB) TX bytes:986 (986.0 B)\nSuccess – now its time for the big fat warning:\nEvery NIC stores the mac address at different offsets etc. so its a good idea to first look at the datasheet and then make experiments. Also the magic value needed for ethtool needs to be kown – look at the corresponding linux driver.\n","permalink":"https://playground.christian-gmeiner.info/2012-10-13-change-mac-address-under-linux-the-brutal-way/","summary":"\u003cp\u003eLast days I run into a problem that I needed to change the mac address of a network card directly under linux. In the last years VxWorks was used for this purpose – oh and yes I know that you should not change a mac address 🙂 But I am working in a company which produces devices with network ports and they need an initial mac address.\u003c/p\u003e\n\u003cp\u003eThe first thing you would try is to use ifconfig to change the mac address.\u003c/p\u003e","title":"Change mac address under linux - the brutal way"},{"content":"I think all of us run into this problem… the free space on a storage medium is getting smaller and smaller and you are not really sure why this is the case. For such cases I use a graphical tool to see the biggest space waster – as I am QT guy I am using filelight.\n","permalink":"https://playground.christian-gmeiner.info/2012-10-13-who-is-wasting-my-disk-space/","summary":"\u003cp\u003eI think all of us run into this problem… the free space on a storage medium is getting smaller and smaller and you are not really sure why this is the case. For such cases I use a graphical tool to see the biggest space waster – as I am QT guy I am using \u003ca href=\"http://methylblue.com/filelight/\" title=\"filelight\"\u003efilelight\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://methylblue.com/filelight/images/filelight-1.0.png\" title=\"filelight\"\u003e\u003c/p\u003e","title":"Who is wasting my disk space"},{"content":"The last two days I found again some time to hack on the em8300/dxr3 driver. I see the end comming of all my work, but I need to change the way I work. I have renamed the old project on github to v4l2-em8300-old and created a new one. Yes you have heard it correctly – a new one. I think that I have enough knowledge to start from scratch.\nThe new repository can be found here: https://github.com/austriancoder/v4l2-em8300\n","permalink":"https://playground.christian-gmeiner.info/2012-08-07-em8300-starting-from-scratch/","summary":"\u003cp\u003eThe last two days I found again some time to hack on the em8300/dxr3 driver. I see the end comming of all my work, but I need to change the way I work. I have renamed the old project on github to v4l2-em8300-old and created a new one. Yes you have heard it correctly – a new one. I think that I have enough knowledge to start from scratch.\u003c/p\u003e\n\u003cp\u003eThe new repository can be found here: \u003ca href=\"https://github.com/austriancoder/v4l2-em8300\"\u003ehttps://github.com/austriancoder/v4l2-em8300\u003c/a\u003e\u003c/p\u003e","title":"em8300: starting from scratch"},{"content":"Every developer should know this – and its a free course… for what are you waiting?\nClick Me\n","permalink":"https://playground.christian-gmeiner.info/2012-08-07-interrupt-handling-in-linux-device-drivers/","summary":"\u003cp\u003eEvery developer should know this – and its a free course… for what are you waiting?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://training.linuxfoundation.org/linux-tutorials/interrupt-handling-in-linux-device-drivers\"\u003eClick Me\u003c/a\u003e\u003c/p\u003e","title":"interrupt handling in linux device drivers"},{"content":"Lets image you are working on a coreboot port for some mainboard and you are a very glad guy cause you have a jtag interface or something similar and you notice a hang, which could be caused by a never ending loop or some other mysterious stuff – all you know is the current instruction pointer.\nobjdump -S ./build/cbfs/fallback/coreboot_ram.elf\nand search for the address of the instruction pointer – may it help you to figure out whats going on 🙂\n","permalink":"https://playground.christian-gmeiner.info/2012-07-18-objdump-is-your-friend/","summary":"\u003cp\u003eLets image you are working on a coreboot port for some mainboard and you are a very glad guy cause you have a jtag interface or something similar and you notice a hang, which could be caused by a never ending loop or some other mysterious stuff – all you know is the current instruction pointer.\u003c/p\u003e\n\u003cp\u003eobjdump -S ./build/cbfs/fallback/coreboot_ram.elf\u003c/p\u003e\n\u003cp\u003eand search for the address of the instruction pointer – may it help you to figure out whats\ngoing on 🙂\u003c/p\u003e","title":"objdump is your friend"},{"content":"Sometimes it is needed to compare two filesystems, which can be done quite easily:\ndiff -rq /mnt/fs1 /mnt/fs2\n","permalink":"https://playground.christian-gmeiner.info/2012-06-19-compare-two-filesystems-recursively/","summary":"\u003cp\u003eSometimes it is needed to compare two filesystems, which can be done quite easily:\u003c/p\u003e\n\u003cp\u003ediff -rq /mnt/fs1 /mnt/fs2\u003c/p\u003e","title":"Compare Two Filesystems Recursively"},{"content":"Image you destroyed your MBR sector of your hard drive/flash device and you are not able to load grub. You can easily fix this issue from an other Linux based computer. Simply run the following commands:\nmount /dev/sda1 /mnt/ mount -t proc none /mnt/proc mount -o bind /dev /mnt/dev chroot /mnt/ /bin/bash /usr/sbin/grub-install –recheck –no-floppy /dev/sda With this routine it it is also possible to fix UUID problems.\n","permalink":"https://playground.christian-gmeiner.info/2012-01-31-install-grub-in-a-chroot-environment/","summary":"\u003cp\u003eImage you destroyed your MBR sector of your hard drive/flash device and you are not able to load grub. You can easily fix this issue from an other Linux based computer. Simply run the following commands:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emount /dev/sda1 /mnt/\u003c/li\u003e\n\u003cli\u003emount -t proc none /mnt/proc\u003c/li\u003e\n\u003cli\u003emount -o bind /dev /mnt/dev\u003c/li\u003e\n\u003cli\u003echroot /mnt/ /bin/bash\u003c/li\u003e\n\u003cli\u003e/usr/sbin/grub-install –recheck –no-floppy /dev/sda\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWith this routine it it is also possible to fix UUID problems.\u003c/p\u003e","title":"Install Grub in a chroot environment"},{"content":"Um eine breitere Masse zu erreichen, wird der Blog geswitcht..\nStarting with this second the whole blog will be in English and it will cover a broader range of topics…\n","permalink":"https://playground.christian-gmeiner.info/2012-01-26-switching/","summary":"\u003cp\u003eUm eine breitere Masse zu erreichen, wird der Blog geswitcht..\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStarting with this second the whole blog will be in English and it will cover a broader range of topics…\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Switching"},{"content":"Hallo zusammen.\nIch habe schon länger nichts mehr von mir hören lassen, doch nun habe ich ein Update bezüglich em8300 und dem langsamen aber stätigem Prozess zur Aufnahme in den Mainline Kernel.\nIm Linux Kernel 3.3.0 sind kleine Änderungen für die adv7170 und adb7175 Treiber eingeflossen, welche vom em8300 Treiber benötigt werden. Somit wäre es dann möglich direkt mit dem V4L2 Subdevices zu arbeiten. Was gibt es aber sonst noch zu tun, damit der Prozess irgendwann ein Ende findet?\nbt868 Treiber in den Mainline bringen VB2 Evtl die DVB-API untersuchen, ob besser als V4L2 API für Ausgbae Rework des Firmware-Loaders Locking … Ich hoffe, dass ich in den nächsten Wochen wieder ein wenig Zeit finde.\n","permalink":"https://playground.christian-gmeiner.info/2011-11-07-status-update/","summary":"\u003cp\u003eHallo zusammen.\u003c/p\u003e\n\u003cp\u003eIch habe schon länger nichts mehr von mir hören lassen, doch nun habe ich ein Update\nbezüglich em8300 und dem langsamen aber stätigem Prozess zur Aufnahme in den Mainline Kernel.\u003c/p\u003e\n\u003cp\u003eIm Linux Kernel 3.3.0 sind kleine Änderungen für die adv7170 und adb7175 Treiber eingeflossen, welche vom em8300 Treiber benötigt werden. Somit wäre es dann möglich direkt mit dem V4L2 Subdevices zu arbeiten. Was gibt es aber sonst noch zu tun, damit der Prozess irgendwann ein Ende findet?\u003c/p\u003e","title":"Status Update"},{"content":"[ 4204.966614] Sigma Designs EM8300 0000:00:09.0: PCI INT A -\u0026gt; Link[LNKB] -\u0026gt; GSI 5 (level, low) -\u0026gt; IRQ 5 [ 4204.966637] em8300-0: EM8300 8300 (rev 2) [ 4204.966642] bus: 0, devfn: 72, irq: 5, [ 4204.966647] memory: 0xcfe00000. [ 4204.966998] em8300-0: mapped-memory at 0xf9600000 [ 4204.967163] em8300-0: using MTRR [ 4205.038676] bus 0: i2c scan: found device @ 0x8a [bt865] [ 4205.169007] bus 1: i2c scan: found device @ 0xa0 [eeprom] [ 4205.215170] i2c i2c-2: client [eeprom] registered with bus id 2-0050 [ 4205.268272] full 256-byte eeprom dump: [ 4205.268284] 00: 10 22 00 00 00 00 00 01 00 00 00 00 00 00 00 00 [ 4205.268299] 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 4205.268313] 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 4205.268327] 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 4205.268340] 40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268355] 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 4205.268368] 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 4205.268381] 70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 [ 4205.268394] 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268408] 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268422] a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268436] b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268450] c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268465] d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268479] e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268493] f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 4205.268510] em8300-0: detected card: DXR3 with BT865. [ 4205.268517] em8300-0: Chip revision: 2 [ 4205.276298] bt865 1-0045: chip found @ 0x8a (em8300 i2c driver #0-0) [ 4205.276910] i2c i2c-1: client [bt865] registered with bus id 1-0045\n","permalink":"https://playground.christian-gmeiner.info/2011-05-21-v4l2-em8300-eeprom-dumps/","summary":"\u003cp\u003e[ 4204.966614] Sigma Designs EM8300 0000:00:09.0: PCI INT A -\u0026gt; Link[LNKB] -\u0026gt; GSI 5 (level, low) -\u0026gt; IRQ 5\n[ 4204.966637] em8300-0: EM8300 8300 (rev 2)\n[ 4204.966642] bus: 0, devfn: 72, irq: 5,\n[ 4204.966647] memory: 0xcfe00000.\n[ 4204.966998] em8300-0: mapped-memory at 0xf9600000\n[ 4204.967163] em8300-0: using MTRR\n[ 4205.038676] bus 0: i2c scan: found device @ 0x8a  [bt865]\n[ 4205.169007] bus 1: i2c scan: found device @ 0xa0  [eeprom]\n[ 4205.215170] i2c i2c-2: client [eeprom] registered with bus id 2-0050\n[ 4205.268272] full 256-byte eeprom dump:\n[ 4205.268284] 00: 10 22 00 00 00 00 00 01 00 00 00 00 00 00 00 00\n[ 4205.268299] 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n[ 4205.268313] 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n[ 4205.268327] 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n[ 4205.268340] 40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268355] 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n[ 4205.268368] 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n[ 4205.268381] 70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55\n[ 4205.268394] 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268408] 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268422] a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268436] b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268450] c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268465] d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268479] e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268493] f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\n[ 4205.268510] em8300-0: detected card: DXR3 with BT865.\n[ 4205.268517] em8300-0: Chip revision: 2\n[ 4205.276298] bt865 1-0045: chip found @ 0x8a (em8300 i2c driver #0-0)\n[ 4205.276910] i2c i2c-1: client [bt865] registered with bus id 1-0045\u003c/p\u003e","title":"v4l2-em8300 - EEPROM dumps"},{"content":"Hier wieder ein Lebenszeichen vom v4l2-em8300 Projekt.\nIch habe die letzten zwei Tage genützt um den Audio Teil des Treibers ein wenig aufzuräumen. Ab jetzt wird nur noch ALSA unterstützt und alle Moduloptionen bezüglich Audio wurden entfernt. Langsam aber sicher habe ich schon viele Teile aufgeräumt und der Treiber wird immer besser 🙂\nÜber die nächsten Schritte in der Entwicklung bin ich mir noch nicht sicher. vbuf2 wäre sicherlich eine Überlegung wert, da ich möglichst viel Kernel-Funktionalität verwenden möchte – macht den Treiber schön klein und übersichtlich. Ich hoffe ich werde in den nächsten Wochen/Monaten wieder einmal Richtig viel Zeit fürs hacken haben.\nAchja – Sourcen gibts hier.\n","permalink":"https://playground.christian-gmeiner.info/2011-05-21-v4l2-em8300-audio-cleanups/","summary":"\u003cp\u003eHier wieder ein Lebenszeichen vom v4l2-em8300 Projekt.\u003c/p\u003e\n\u003cp\u003eIch habe die letzten zwei Tage genützt um den Audio Teil des Treibers ein wenig aufzuräumen. Ab jetzt wird nur noch ALSA unterstützt und alle Moduloptionen bezüglich\nAudio wurden entfernt. Langsam aber sicher habe ich schon viele Teile aufgeräumt und der\nTreiber wird immer besser 🙂\u003c/p\u003e\n\u003cp\u003eÜber die nächsten Schritte in der Entwicklung bin ich mir noch nicht sicher. vbuf2 wäre sicherlich eine Überlegung wert, da ich möglichst viel Kernel-Funktionalität verwenden möchte – macht den Treiber schön klein und übersichtlich. Ich hoffe ich werde in den nächsten Wochen/Monaten wieder einmal Richtig viel Zeit fürs hacken haben.\u003c/p\u003e","title":"v4l2-em8300 - Audio Cleanups"},{"content":"http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=4ba8216cd90560bc402f52076f64d8546e8aefcb\n","permalink":"https://playground.christian-gmeiner.info/2011-05-08-bye-bye-bkl/","summary":"\u003cp\u003e\u003ca href=\"http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=4ba8216cd90560bc402f52076f64d8546e8aefcb\"\u003ehttp://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=4ba8216cd90560bc402f52076f64d8546e8aefcb\u003c/a\u003e\u003c/p\u003e","title":"Bye Bye BKL"},{"content":"Nun finde ich endlich einmal wieder ein wenig Zeit für diesen Blog… und was soll ich sagen, er ist wieder online 🙂 Möge er mit vielen Inhalten gefüllt werden.\n","permalink":"https://playground.christian-gmeiner.info/2011-04-21-blog-is-back/","summary":"\u003cp\u003eNun finde ich endlich einmal wieder ein wenig Zeit für diesen Blog… und was soll ich sagen, er ist wieder online 🙂 Möge er mit vielen Inhalten gefüllt werden.\u003c/p\u003e","title":"Blog is back...."},{"content":" echo “” | cpp -dD\nDies kann hin und wieder recht nützlich sein.\n","permalink":"https://playground.christian-gmeiner.info/2010-11-25-default-defines-vom-gcc/","summary":"\u003cblockquote\u003e\n\u003cp\u003eecho “” | cpp -dD\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDies kann hin und wieder recht nützlich sein.\u003c/p\u003e","title":"Default #define's vom GCC"},{"content":"In letzter Zeit hat sich wieder ein wenig was beim Plugin getan. Die OSS Ausgabe wurde nun entfernt um sich ganz der Audioausgabe mittles ALSA zu widmen. Leider gibt es in diesem Bereich noch ein paar kleinere Probleme, doch ich hoffe diese noch in den Griff zu bekommen. Das Wechseln des Kanales geht nun ohne gröbere Probleme (ALSA spinnt hin und wieder noch) und das Plugin kompiliert auch mit ffmpeg 0.6.\nAuf meiner TODO findet sich im Moment folgendes:\nAC3-Support für ALSA ALSA Bugfixing StillPicture die letzten Sync-Probleme lösen Es wird dann nicht mehr lange gehen, bis ich den buffer-sync-rewrite branch in den trunk mergen werde und dann sollte endlich ein neues langerwartetes Release folgen.\nBTW: Es ist zu empfehlen einen modifizierten Treiber für die dxr3 zu verwenden, welchen es hier gibt: hg.assembla.com/em8300-cgmeiner\n","permalink":"https://playground.christian-gmeiner.info/2010-06-28-vdr-plugin-dxr3-updates/","summary":"\u003cp\u003eIn letzter Zeit hat sich wieder ein wenig was beim Plugin getan. Die OSS Ausgabe wurde nun entfernt um sich ganz der Audioausgabe mittles ALSA zu widmen. Leider gibt es in diesem Bereich\nnoch ein paar kleinere Probleme, doch ich hoffe diese noch in den Griff zu bekommen. Das Wechseln des Kanales geht nun ohne gröbere Probleme (ALSA spinnt hin und wieder noch) und das Plugin kompiliert auch mit ffmpeg 0.6.\u003c/p\u003e","title":"vdr-plugin-dxr3 updates"},{"content":"Hin und wieder finde ich ein wenig Zeit um am Plugin zu arbeiten. Audio und Video Sync scheint nun recht gut zu funktioneren (noch nicht commited), doch leider bekomme ich oft noch XRuns in alsa. Da ich den oss Support aus dem Plugin entfernen will, ist es sicherlich keine schlechte Idee, den alsa Ausgabe-Treiber zu fixen.\nZum Glück gibt es die Möglichkeit die XRuns zu debugen – siehe hier. Ich werde sicherlich noch ein paar nette Studen mit alsa verbringen.\n","permalink":"https://playground.christian-gmeiner.info/2010-06-18-alsa/","summary":"\u003cp\u003eHin und wieder finde ich ein wenig Zeit um am Plugin zu arbeiten. Audio und Video Sync scheint nun recht gut zu funktioneren (noch nicht commited), doch leider bekomme ich oft noch XRuns in alsa. Da ich den oss Support aus dem Plugin entfernen will, ist es sicherlich keine schlechte Idee, den alsa Ausgabe-Treiber zu fixen.\u003c/p\u003e\n\u003cp\u003eZum Glück gibt es die Möglichkeit die XRuns zu debugen – siehe \u003ca href=\"http://www.alsa-project.org/main/index.php/XRUN_Debug\"\u003ehier\u003c/a\u003e. Ich werde sicherlich noch ein paar nette Studen mit alsa verbringen.\u003c/p\u003e","title":"alsa"},{"content":"\n","permalink":"https://playground.christian-gmeiner.info/2010-03-06-pulseaudio-meets-vdr-plugin-dxr3/","summary":"\u003cp\u003e\u003cimg alt=\"pa-dxr3\" loading=\"lazy\" src=\"http://www.christian-gmeiner.info/wordpress/wp-content/uploads/2010/03/pa-dxr3.png\" title=\"pa-dxr3\"\u003e\u003c/p\u003e","title":"PulseAudio meets vdr-plugin-dxr3"},{"content":" $\u0026gt; PATH=. $\u0026gt; echo ‘a \u0026amp; a’ \u0026gt; a $\u0026gt; chmod 755 a; /bin/bash a\n","permalink":"https://playground.christian-gmeiner.info/2010-03-04-fork-bombe/","summary":"\u003cblockquote\u003e\n\u003cp\u003e$\u0026gt; PATH=.\n$\u0026gt; echo ‘a \u0026amp; a’ \u0026gt; a\n$\u0026gt; chmod 755 a; /bin/bash a\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Fork-Bombe"},{"content":"Endlich ist es so weit, nach viel Research und vielem Probieren ist der Buffer und A/V Sync rewrite in progress 🙂\nNun brauche ich sehr viel Feedback bezüglich A/V sync… also alle testen. http://projects.vdr-developer.org/git/?p=vdr-plugin-dxr3.git;a=shortlog;h=refs/heads/buffer-and-sync-rewrite\nDanke euch allen\n","permalink":"https://playground.christian-gmeiner.info/2010-02-05-buffer-und-av-sync-rewrite/","summary":"\u003cp\u003eEndlich ist es so weit, nach viel Research und vielem Probieren ist der Buffer und A/V Sync rewrite in progress 🙂\u003c/p\u003e\n\u003cp\u003eNun brauche ich sehr viel Feedback bezüglich A/V sync… also alle testen.\n\u003ca href=\"http://projects.vdr-developer.org/git/?p=vdr-plugin-dxr3.git;a=shortlog;h=refs/heads/buffer-and-sync-rewrite\"\u003ehttp://projects.vdr-developer.org/git/?p=vdr-plugin-dxr3.git;a=shortlog;h=refs/heads/buffer-and-sync-rewrite\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDanke euch allen\u003c/p\u003e","title":"Buffer und A/V Sync rewrite"},{"content":"Im Moment bin ich damit konfrontiert, Backups von einem alten exteren Bandlaufwerk wiederherzustellen. Das große Ziel ist es an einen Bruchteil der Daten auf dem Bandlaufwerk Zugang zu bekommen.\nMein Kunde verwendet im Moment einen aktuellen Recher (Quad-Core) mit einem ebenso aktuellen Windows. Blöderweise werden keine Treiber von HP für diese Windows-Version zur Verfügung gestellt und ich musste nach einer Alternative ausschau halten. Und hier glänzt Linux. Ich verwende einen 2.6.32 Kernel und konnte mit diesem erfolgreich das externe Bandlaufwerk (Parallel-Port) erkennen/verwenden.\nDazu müssen folgende Module compiliert und geladen werden:\nepat paride pt Ist das Bandlaufwerk verbunden und die Module geladen sollte folgendes via *dmesg *zu sehen sein.\nparide: epat registered as protocol 0 pt: pt version 1.04, major 96 pt0: Sharing parport0 at 0x378 pt0: epat 1.02, Shuttle EPAT chip c6 at 0x378, mode 2 (8-bit), delay 1 pt0: HP COLORADO 20GBe, master, blocksize 512, 9209 MB\n","permalink":"https://playground.christian-gmeiner.info/2010-01-19-linux-und-hp-colorado-20gbeextern/","summary":"\u003cp\u003eIm Moment bin ich damit konfrontiert, Backups von einem alten exteren Bandlaufwerk wiederherzustellen. Das große Ziel ist es an einen Bruchteil der Daten auf dem Bandlaufwerk Zugang zu bekommen.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://www.buycoms.com/pic/product/129/14085/TAB6_2.JPG\" title=\"HP Colorado 20 GB\"\u003eMein Kunde verwendet im Moment einen aktuellen Recher (Quad-Core) mit einem ebenso aktuellen Windows. Blöderweise werden keine Treiber von HP für diese Windows-Version zur Verfügung gestellt und ich musste nach einer Alternative ausschau halten. Und hier glänzt Linux. Ich verwende einen 2.6.32 Kernel und konnte mit diesem erfolgreich das externe Bandlaufwerk (Parallel-Port) erkennen/verwenden.\u003c/p\u003e","title":"Linux und HP COLORADO 20GBe(extern)"},{"content":"int ,l; char*I, O[]={\u0026quot;\u0026quot;, \u0026ldquo;gjstu\u0026rdquo;,\u0026ldquo;t\u0026rdquo; \u0026ldquo;fdpoe\u0026rdquo;,\u0026ldquo;uij\u0026rdquo; \u0026ldquo;se\u0026rdquo;,\u0026ldquo;gpvsui\u0026rdquo;, \u0026ldquo;gjgui\u0026rdquo;,\u0026ldquo;t\u0026rdquo; \u0026ldquo;jyui\u0026rdquo;,\u0026ldquo;tfwf\u0026rdquo; \u0026ldquo;oui\u0026rdquo;,\u0026ldquo;fjhiui\u0026rdquo;, \u0026ldquo;ojoui\u0026rdquo;,\u0026ldquo;ufoui\u0026rdquo;, \u0026ldquo;fmfwfoui\u0026rdquo;,\u0026ldquo;uxfmgu\u0026rdquo; \u0026ldquo;i\u0026rdquo;,\u0026ldquo;b!qbsusjehf!jo!\u0026rdquo; \u0026ldquo;b!qfbs!usff/xbxb\u0026rdquo;,\u0026quot;\u0026quot; \u0026ldquo;uxp!uvsumf!epwf\u0026rdquo; \u0026ldquo;t-xb\u0026rdquo;,\u0026ldquo;uisff!gsf\u0026rdquo; \u0026ldquo;odi!ifot-!\u0026rdquo;,\u0026ldquo;gpvs!d\u0026rdquo; \u0026ldquo;bmmjoh!cjset-!\u0026rdquo;,\u0026ldquo;gjwf\u0026rdquo; \u0026ldquo;!hpme!sjoht\u0026lt;xb\u0026rdquo;,\u0026ldquo;tjy!h\u0026rdquo; \u0026ldquo;fftf!b.mbzjoh-!\u0026rdquo;,\u0026ldquo;tfwfo!t\u0026rdquo; \u0026ldquo;xbot!b.txjnnjoh-xb\u0026rdquo;,\u0026ldquo;fjhiu\u0026rdquo; \u0026ldquo;!nbjet!b.njmljoh-!\u0026rdquo;,\u0026ldquo;ojof!mbe\u0026rdquo; \u0026ldquo;jft!ebodjoh-!\u0026rdquo;,\u0026ldquo;ufo!m\u0026rdquo; \u0026ldquo;pset!b.mfbqjoh-xb\u0026rdquo;,\u0026ldquo;fm\u0026rdquo; \u0026ldquo;fwfo!qjqfst!qjqjoh-!\u0026rdquo;,\u0026ldquo;ux\u0026rdquo; \u0026ldquo;fmwf!esvnnfst!esvnnjoh-!\u0026rdquo;,\u0026quot;\u0026quot; \u0026ldquo;Po!uif!\u0026rdquo;,\u0026quot;!ebz!pg!Disjtunbt!n\u0026quot; \u0026ldquo;z!usvf!mpwf!hbwf!up!nfxb\u0026rdquo;,\u0026ldquo;boe\u0026rdquo; \u0026ldquo;!\u0026rdquo;};int putchar(int);int main(void ){while(l\u0026lt;(sizeof O/sizeofO-2)/2-1){ I=O[=!?sizeof O/sizeof*O- 3:\u0026lt;(sizeof(O)/sizeofO-2)/2? sizeof O/sizeofO-2:==(sizeof( O)/sizeof*O-2)/2?++l,0:\u0026lt;(sizeof( O)/sizeof(O))-3?(_-1)==(sizeof(O)/ sizeofO-2)/2?sizeof O/sizeofO-1:-1 :\u0026lt;sizeof(O)/sizeofO-2?l+1:_\u0026lt;sizeof(O) /sizeof*O-1?l+(sizeof O/sizeof(O)-2)/2:( sizeof(O)/sizeofO-2)/2];while(*I){putchar( *I++-1);}} return 0;}\n","permalink":"https://playground.christian-gmeiner.info/2009-12-21-es-weihnachtet-sehr/","summary":"\u003cp\u003eint \u003cem\u003e,l; char*I, \u003cem\u003eO[]={\u0026quot;\u0026quot;, \u0026ldquo;gjstu\u0026rdquo;,\u0026ldquo;t\u0026rdquo; \u0026ldquo;fdpoe\u0026rdquo;,\u0026ldquo;uij\u0026rdquo; \u0026ldquo;se\u0026rdquo;,\u0026ldquo;gpvsui\u0026rdquo;, \u0026ldquo;gjgui\u0026rdquo;,\u0026ldquo;t\u0026rdquo; \u0026ldquo;jyui\u0026rdquo;,\u0026ldquo;tfwf\u0026rdquo; \u0026ldquo;oui\u0026rdquo;,\u0026ldquo;fjhiui\u0026rdquo;, \u0026ldquo;ojoui\u0026rdquo;,\u0026ldquo;ufoui\u0026rdquo;, \u0026ldquo;fmfwfoui\u0026rdquo;,\u0026ldquo;uxfmgu\u0026rdquo; \u0026ldquo;i\u0026rdquo;,\u0026ldquo;b!qbsusjehf!jo!\u0026rdquo; \u0026ldquo;b!qfbs!usff/xbxb\u0026rdquo;,\u0026quot;\u0026quot; \u0026ldquo;uxp!uvsumf!epwf\u0026rdquo; \u0026ldquo;t-xb\u0026rdquo;,\u0026ldquo;uisff!gsf\u0026rdquo; \u0026ldquo;odi!ifot-!\u0026rdquo;,\u0026ldquo;gpvs!d\u0026rdquo; \u0026ldquo;bmmjoh!cjset-!\u0026rdquo;,\u0026ldquo;gjwf\u0026rdquo; \u0026ldquo;!hpme!sjoht\u0026lt;xb\u0026rdquo;,\u0026ldquo;tjy!h\u0026rdquo; \u0026ldquo;fftf!b.mbzjoh-!\u0026rdquo;,\u0026ldquo;tfwfo!t\u0026rdquo; \u0026ldquo;xbot!b.txjnnjoh-xb\u0026rdquo;,\u0026ldquo;fjhiu\u0026rdquo; \u0026ldquo;!nbjet!b.njmljoh-!\u0026rdquo;,\u0026ldquo;ojof!mbe\u0026rdquo; \u0026ldquo;jft!ebodjoh-!\u0026rdquo;,\u0026ldquo;ufo!m\u0026rdquo; \u0026ldquo;pset!b.mfbqjoh-xb\u0026rdquo;,\u0026ldquo;fm\u0026rdquo; \u0026ldquo;fwfo!qjqfst!qjqjoh-!\u0026rdquo;,\u0026ldquo;ux\u0026rdquo; \u0026ldquo;fmwf!esvnnfst!esvnnjoh-!\u0026rdquo;,\u0026quot;\u0026quot; \u0026ldquo;Po!uif!\u0026rdquo;,\u0026quot;!ebz!pg!Disjtunbt!n\u0026quot; \u0026ldquo;z!usvf!mpwf!hbwf!up!nfxb\u0026rdquo;,\u0026ldquo;boe\u0026rdquo; \u0026ldquo;!\u0026rdquo;};int putchar(int);int main(void ){while(l\u0026lt;(sizeof O/sizeof\u003c/em\u003eO-2)/2-1){ I=O[\u003c/em\u003e=!\u003cem\u003e?sizeof O/sizeof*O- 3:\u003c/em\u003e\u0026lt;(sizeof(O)/sizeof\u003cem\u003eO-2)/2? sizeof O/sizeof\u003c/em\u003eO-2:\u003cem\u003e==(sizeof( O)/sizeof*O-2)/2?++l,0:\u003c/em\u003e\u0026lt;(sizeof( O)/sizeof(\u003cem\u003eO))-3?(_-1)==(sizeof(O)/ sizeof\u003c/em\u003eO-2)/2?sizeof O/sizeof\u003cem\u003eO-1:\u003cem\u003e-1 :\u003c/em\u003e\u0026lt;sizeof(O)/sizeof\u003c/em\u003eO-2?l+1:_\u0026lt;sizeof(O) /sizeof*O-1?l+(sizeof O/sizeof(\u003cem\u003eO)-2)/2:( sizeof(O)/sizeof\u003c/em\u003eO-2)/2];while(*I){putchar( *I++-1);}} return 0;}\u003c/p\u003e","title":"Es weihnachtet sehr..."},{"content":"41f0211ca48e2c5a5af1fe41f9af644012fe91c4 – das ist der Commit der Audioprobleme mit VDR 1.7 korrigiert. Noch gibt av_log eine Warnung aus:\n[mp3 @ 0x9e70a60]incorrect frame size\nDiese kann ignoriert werden… die Ursache ist mir bekannt, doch ich bin mir noch nicht sicher, wie ich das am schönsten löse 🙂\nUpdate:\nDer Bug 169 ist nun mit Commit 961b570ff897b54beabdcb4c54e59049203ce10a gefixt.\n","permalink":"https://playground.christian-gmeiner.info/2009-12-05-vdr-1-7-statusupdate/","summary":"\u003cp\u003e\u003ca href=\"http://projects.vdr-developer.org/git/?p=vdr-plugin-dxr3.git;a=commitdiff;h=41f0211ca48e2c5a5af1fe41f9af644012fe91c4\"\u003e41f0211ca48e2c5a5af1fe41f9af644012fe91c4\u003c/a\u003e – das ist der Commit der Audioprobleme mit VDR 1.7\nkorrigiert. Noch gibt av_log eine Warnung aus:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[mp3 @ 0x9e70a60]incorrect frame size\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDiese kann ignoriert werden… die Ursache ist mir bekannt, doch ich bin mir noch nicht sicher, wie\nich das am schönsten löse 🙂\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUpdate:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDer Bug 169 ist nun mit Commit 961b570ff897b54beabdcb4c54e59049203ce10a gefixt.\u003c/p\u003e","title":"VDR 1.7 Statusupdate [Upd]"},{"content":"Endlich habe ich auf meinem VDR die Version 1.7.10 installiert und schon bin ich mir sicher, was ich die nächsten Stunden zu machen habe. So wie es aussieht braucht der audiodecoder eine Grunderneuerung, damit die Soundprobleme mit der 1.7.10 Version gefixt werden können. Ich nutzte diese Gelegenheit um den Release einer neuen Version zu verschieben. Des Weiterem gibt es auch noch ein paar Bugreports, die ich in Angriff nehmen sollte.\n","permalink":"https://playground.christian-gmeiner.info/2009-12-03-audiodecoder-und-1-7-10/","summary":"\u003cp\u003eEndlich habe ich auf meinem VDR die Version 1.7.10 installiert und schon bin ich mir sicher,\nwas ich die nächsten Stunden zu machen habe.\nSo wie es aussieht braucht der audiodecoder eine Grunderneuerung, damit die Soundprobleme\nmit der 1.7.10 Version gefixt werden können. Ich nutzte diese Gelegenheit um den Release einer\nneuen Version zu verschieben. Des Weiterem gibt es auch noch ein paar Bugreports, die ich in Angriff\nnehmen sollte.\u003c/p\u003e","title":"audiodecoder und 1.7.10"},{"content":"Hallo zusammen,\nmeine Schwester benötigt für ihre Bachelorarbeit zum Thema „Der Einsatz von Social Media beim Verkauf von Merchandise-Produkten − Dargestellt an einem Praxisbeispiel aus der Musikbranche“ eure Hilfe.\nEinfach http://vote.sinceyouaredead.at besuchen und sich 10 Minuten Zeit nehmen um die Umfrage zu beantworten. Unter allen Teilnehmer – EMail-Adresse vorausgesetzt – werden Preise verlost.\nDanke! ","permalink":"https://playground.christian-gmeiner.info/2009-11-17-brauche-eure-hilfe/","summary":"\u003cp\u003eHallo zusammen,\u003c/p\u003e\n\u003cp\u003emeine Schwester benötigt für ihre \u003cspan style=\"letter-spacing: 0px;\"\u003eBachelorarbeit zum Thema „Der Einsatz von Social Media beim Verkauf von Merchandise-Produkten − Dargestellt an einem Praxisbeispiel aus der Musikbranche“ eure Hilfe.\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"letter-spacing: 0px;\"\u003eEinfach \u003ca href=\"http://vote.sinceyouaredead.at\"\u003ehttp://vote.sinceyouaredead.at\u003c/a\u003e besuchen und sich 10 Minuten Zeit nehmen um die Umfrage zu beantworten. Unter allen Teilnehmer – EMail-Adresse vorausgesetzt – werden Preise verlost.\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"letter-spacing: 0px;\"\u003eDanke!\n\u003c/span\u003e\u003c/p\u003e","title":"Brauche eure Hilfe"},{"content":"Die nächsten 5 Tage bin ich auf kurz Urlaub in London und werde aus diesem Grund unwahrscheinlich Mails beantworten…\nSchönes Wochenende\n","permalink":"https://playground.christian-gmeiner.info/2009-10-23-london-ich-komme/","summary":"\u003cp\u003eDie nächsten 5 Tage bin ich auf kurz Urlaub in London und werde aus diesem Grund unwahrscheinlich Mails beantworten…\u003c/p\u003e\n\u003cp\u003eSchönes Wochenende\u003c/p\u003e","title":"London ich komme..."},{"content":"Hallo,\nendlich habe ich mich getraut, den alten SpuEncoder durch den neuen zu ersetzten, auch wenn es noch zu Problemen kommen kann. Doch dies war ein wichtiger Schritt in die richtige Richtung.\nBevor ich die bekannten Bugs im SpuEncoder behebe, brauche ich ein bisschen Abstand und von dieser Thematik und bin dabei die StillPicture-Methode zu fixen. Wie es sich herausstellt ist das Vorhaben – wie sollte es anders sein – nicht ganz trivial. Zu aller erst muss ich mich mit den verschiedenen Playmodes vertraut machen und da habe ich schon ein paar Dinge gefunden, die im Treiber nicht vorhanden sind. Ein Beispiel wäre hier EM8300_PLAYMODE_SINGLESTEP. Ist zwar in der em8300.h vorhanden, wird aber vom Treiber nicht unterstützt. Das wird noch eine interessante Reise in das Land der em8300 werden. Es wäre schön, wenn es eine ordentlich dokumentierte API für die Treiber geben würde. Bin es aber eh schon gewohnt immer alles auszuprobieren zu müssen und nach 1-2 Tagen hackings eine Lösung zu finden.\ngreets\n","permalink":"https://playground.christian-gmeiner.info/2009-10-16-stillpictures/","summary":"\u003cp\u003eHallo,\u003c/p\u003e\n\u003cp\u003eendlich habe ich mich getraut, den alten SpuEncoder durch den neuen zu ersetzten, auch wenn es noch zu Problemen\nkommen kann. Doch dies war ein wichtiger Schritt in die richtige Richtung.\u003c/p\u003e\n\u003cp\u003eBevor ich die bekannten Bugs im SpuEncoder behebe, brauche ich ein bisschen Abstand und von dieser Thematik und bin dabei die StillPicture-Methode zu fixen. Wie es sich herausstellt ist das Vorhaben – wie sollte es anders sein – nicht ganz trivial. Zu aller erst muss ich mich mit den verschiedenen Playmodes vertraut machen und da habe ich schon ein paar Dinge gefunden, die im Treiber nicht vorhanden sind. Ein Beispiel wäre hier  EM8300_PLAYMODE_SINGLESTEP. Ist zwar in der em8300.h vorhanden, wird aber vom Treiber nicht unterstützt.\nDas wird noch eine interessante Reise in das Land der em8300 werden. Es wäre schön, wenn es eine ordentlich dokumentierte API für die Treiber geben würde. Bin es aber eh schon gewohnt immer alles auszuprobieren zu müssen und nach 1-2 Tagen hackings eine Lösung zu finden.\u003c/p\u003e","title":"StillPictures"},{"content":"Im Moment bin ich dabei diesen Bugreport zu fixen und habe auch schon herausgefunden, was falsch läuft. Nun bin ich soweit, dass ich alle Areas des OSD auch probiere auszugeben. Und zwar encode ich im Moment jede Area und schreibe die Daten an das SPU-Subdevice. Nun dachte ich mir, dass die anzeigten OSD-Teile auch so lange angezeigt werden, bis ich das OSD von Hand cleane. Doch dies scheint leider nicht zu funktionieren. Im Moment flackern alle Areas eines OSD auf dem TV… sprich beim Schreiben einer Area, wird das bereits angezeigte OSD gelöscht. Mal schauen, ob ich das einfach fixen kann… ansonsten wird es schwieriger….\nStay tuned\n","permalink":"https://playground.christian-gmeiner.info/2009-10-05-ticket-166/","summary":"\u003cp\u003eIm Moment bin ich dabei \u003ca href=\"http://projects.vdr-developer.org/issues/show/166\"\u003ediesen Bugrepor\u003c/a\u003et zu fixen und habe auch schon herausgefunden, was falsch läuft.\nNun bin ich soweit, dass ich alle Areas des OSD auch probiere auszugeben. Und zwar encode ich im Moment\njede Area und schreibe die Daten an das SPU-Subdevice. Nun dachte ich mir, dass die anzeigten OSD-Teile auch so lange\nangezeigt werden, bis ich das OSD von Hand cleane. Doch dies scheint leider nicht zu funktionieren. Im Moment\nflackern alle Areas eines OSD auf dem TV… sprich beim Schreiben einer Area, wird das bereits angezeigte OSD gelöscht.\nMal schauen, ob ich das einfach fixen kann… ansonsten wird es schwieriger….\u003c/p\u003e","title":"Ticket #166"},{"content":"Hallo zusammen,\nich bin auf der Suche nach Testern für das neue OSD. Dazu einfach die aktuelle Entwicklerversion des Plugins herunterladen, installieren und testen.\nDie Entwicklerversion ist entweder hier oder via git unter git://\u0026lt;a href=\u0026quot;http://community.xeatre.tv/vdr-plugin-dxr3.git\u0026quot; target=\u0026quot;_blank\u0026quot;\u0026gt;community.xeatre.tv/vdr-plugin-\u0026lt;span\u0026gt;dxr3\u0026lt;/span\u0026gt;.git\u0026lt;/a\u0026gt; verfügbar. Probleme, Wünsche etc. bitte unter http://projects.vdr-developer.org/projects/show/plg-dxr3 melden.\nDanke an Alle\n","permalink":"https://playground.christian-gmeiner.info/2009-09-30-tester-gesucht/","summary":"\u003cp\u003eHallo zusammen,\u003c/p\u003e\n\u003cp\u003eich bin auf der Suche nach Testern für das neue OSD.  Dazu einfach die aktuelle Entwicklerversion\ndes Plugins herunterladen, installieren und testen.\u003c/p\u003e\n\u003cp\u003eDie Entwicklerversion ist entweder \u003ca href=\"http://projects.vdr-developer.org/git/?p=vdr-plugin-dxr3.git;a=snapshot;h=4e6085d8aa2f11c9decba9674ef9152ce6292f65;sf=tgz\"\u003ehier\u003c/a\u003e oder via git unter \u003ccode\u003egit://\u0026lt;a href=\u0026quot;http://community.xeatre.tv/vdr-plugin-dxr3.git\u0026quot; target=\u0026quot;_blank\u0026quot;\u0026gt;community.xeatre.tv/vdr-plugin-\u0026lt;span\u0026gt;dxr3\u0026lt;/span\u0026gt;.git\u0026lt;/a\u0026gt;\u003c/code\u003e\nverfügbar.\nProbleme, Wünsche etc. bitte unter \u003ca href=\"http://projects.vdr-developer.org/projects/show/plg-dxr3\"\u003ehttp://projects.vdr-developer.org/projects/show/plg-dxr3\u003c/a\u003e melden.\u003c/p\u003e\n\u003cp\u003eDanke an Alle\u003c/p\u003e","title":"Tester gesucht"},{"content":"Hier mal ein Foto direkt von meinem TV. Zu sehen ist der aktuelle Stand des Plugins mit dem OSD-rewrite. OSD Regionen werden erkannt doch im Bitstream scheint noch was nicht ganz okay zu sein. Mal schauen wie lange ich dafür noch brauche.\nUpdate\nHier noch zwei Screenshots, die das kleine Tool gtkspu zeigen, welches einen SPU-Datenstrom darstellen kann. Hier sieht das Ganze nicht so schlecht aus. Bei meinem Source stimmen auf jeden Fall die Farben nicht.\nUpdate 2\nIch habe nun zwei kleine Bugs behoben und nun schaut das ganze schon recht gut aus. Die letzten Fehler werde ich in den nächsten Tagen beheben und dann folgt ein git push und jeder kann testen.\n","permalink":"https://playground.christian-gmeiner.info/2009-09-24-osd-update/","summary":"\u003cp\u003eHier mal ein Foto direkt von meinem TV. Zu sehen ist der aktuelle Stand des Plugins mit dem OSD-rewrite. OSD Regionen werden erkannt doch im Bitstream scheint noch was nicht ganz okay zu sein. Mal schauen wie lange ich dafür noch brauche.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.christian-gmeiner.info/wordpress/wp-content/uploads/2009/09/l_1600_1200_FF74AA24-3B9C-4B3D-9FFE-D2ABFF07F8F7.jpeg\"\u003e\u003cimg loading=\"lazy\" src=\"http://www.christian-gmeiner.info/wordpress/wp-content/uploads/2009/09/l_1600_1200_FF74AA24-3B9C-4B3D-9FFE-D2ABFF07F8F7.jpeg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUpdate\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHier noch zwei Screenshots, die das kleine Tool gtkspu zeigen, welches einen SPU-Datenstrom darstellen kann. Hier sieht das Ganze nicht so schlecht aus. Bei meinem Source stimmen auf jeden Fall die Farben nicht.\u003c/p\u003e","title":"OSD Update [UP2]"},{"content":"Jaja… lange ist es her, der letzte Eintrag und scheinbar hat sich immer noch nicht viel geändert. Immer diese Versprechen auf mehr… auf ein besseres Plugin. Nun es stimmt, ich habe 4 verschiedene Checkouts des Source, die alle andere Problembereiche verbessern.\nNun da meine Masterarbeit abgeschlossen ist und ich am kommenden Donnerstag meine Masterprüfung (mündlich) habe, finde ich langsam wieder Zeit für das Plugin. Und das erste das unbedingt gefixt werden muss ist das OSD. Der Source wird leichter verständlich und ist übersichtlicher. Was noch fehlt ist das Handling für Bpp != 2 und hier mache ich diesen Moment gute Fortschritte.\nStay tuned….\n","permalink":"https://playground.christian-gmeiner.info/2009-09-12-ein-update/","summary":"\u003cp\u003eJaja… lange ist es her, der letzte Eintrag und scheinbar hat sich immer noch nicht viel geändert. Immer diese Versprechen auf mehr… auf ein besseres Plugin. Nun es stimmt, ich habe 4 verschiedene Checkouts des Source, die alle andere Problembereiche verbessern.\u003c/p\u003e\n\u003cp\u003eNun da meine Masterarbeit abgeschlossen ist und ich am kommenden Donnerstag meine Masterprüfung (mündlich) habe, finde ich langsam wieder Zeit für das Plugin. Und das erste das unbedingt gefixt werden muss ist das OSD. Der Source wird leichter verständlich und ist übersichtlicher. Was noch fehlt ist das Handling für Bpp != 2 und hier mache ich diesen Moment gute Fortschritte.\u003c/p\u003e","title":"Ein Update"},{"content":"Hallo zusammen,\nmittlerweile ist viel passiert und der syncbuffer und das demuxdevice sind komplett aus dem Source verschwunden. Und mein erstes Teilziel ist erreicht. Ich kann zwischen den Kanälen zappen und ich bekomme jedes mal ohne Tonknister und Co. einen sauberen Sound und das mit guten Umschaltzeiten. Eine Problem für die vielen Probleme mit dem Sync waren dann bemerkbar, als ein OSD angezeigt wurde… habe die Ausgabe abgedreht und siehe da… um Welten besser.\nAls nächstes möchte ich Video auf den TV zaubern und das Lippen-Syncron.. see ya\n","permalink":"https://playground.christian-gmeiner.info/2009-06-13-zapping-ohne-ruckler/","summary":"\u003cp\u003eHallo zusammen,\u003c/p\u003e\n\u003cp\u003emittlerweile ist viel passiert und der syncbuffer und das demuxdevice sind komplett aus dem Source verschwunden. Und mein erstes Teilziel ist erreicht. Ich kann zwischen den Kanälen zappen und ich bekomme jedes mal ohne Tonknister und Co. einen sauberen Sound und das mit guten Umschaltzeiten.\nEine Problem für die vielen Probleme mit dem Sync waren dann bemerkbar, als ein OSD angezeigt wurde… habe die Ausgabe abgedreht und siehe da… um Welten besser.\u003c/p\u003e","title":"Zapping ohne Ruckler"},{"content":"Meine Masterarbeit befindet sich in einem guten Status und nun habe ich wieder einmal ein wenig Zeit für das Plugin gefunden. Der neue SpuEncoder funktioniert schon recht gut, nur bei mehr als 4 Farben steigt er aus. Habe schon alles vorbereit um mit 16 Farben zu arbeiten, doch mir fehlt noch ein Algorithmus, wie ich am besten die unterschiedlichen Regionen erkennen kann.\nEine Region hat einen Start- u. Endzeile und wird genauer ducht Sektionen bestimmt – mittels Startreihe. Ich hoffe ich finde bzw. erfinde solch einen Erkennungsalgorithmus… dann wäre das OSD wesentlich besser.\nCheers\n","permalink":"https://playground.christian-gmeiner.info/2009-05-20-mal-ein-kleines-update/","summary":"\u003cp\u003eMeine Masterarbeit befindet sich in einem guten Status und nun habe ich wieder einmal ein wenig\nZeit für das Plugin gefunden. Der neue SpuEncoder funktioniert schon recht gut, nur bei mehr als\n4 Farben steigt er aus. Habe schon alles vorbereit um mit 16 Farben zu arbeiten, doch mir fehlt noch\nein Algorithmus, wie ich am besten die unterschiedlichen Regionen erkennen kann.\u003c/p\u003e\n\u003cp\u003eEine Region hat einen Start- u. Endzeile und wird genauer ducht Sektionen bestimmt – mittels Startreihe.\nIch hoffe ich finde bzw. erfinde solch einen Erkennungsalgorithmus… dann wäre das OSD wesentlich besser.\u003c/p\u003e","title":"Mal ein kleines Update"},{"content":"Habe soeben mal einen Tree gepusht und darin enthalten ist ein der neue Pes-Parser. Desweiteren habe ich den alten Source ordentlich aufgeräumt. Dabei bin ich schon auf die nächste Baustelle getroffen.\ncFixedLengthFrame oder warum doppele Datenhaltung\nIm Moment wird aus dem Pes-Stream ein cDxr3PesFrame definiert, welcher wichtige Informationen ala Pes, Payload etc. beinhaltet. Dann wird – unter gewissen Umständen – dieser cDxr3PesFrame in einen cFixedLengthFrame kopiert und im SyncBuffer verarbeitet.\nNun habe ich die Idee, den cDxr3PesFrame überall zu verwenden… aus diesem Grund werde ich als erstes die Datenstruktur zur Speicherung von Frames im Syncbuffer auf eine LinkedList abändern. Danach wird schrittweise der cFixedLengthFrame eliminiert. Diese Designänderung macht den Ablauf im Plugin wesentlich einfacher.\nPes-Stream —\u0026gt; wird zu —\u0026gt; cDxr3PesFrame —\u0026gt; wird in SynBuffer gespeichert —\u0026gt; wird via Output-Thread ausgegeben\nMal schauen, wie lange ich für die Änderungen brauche und viele neue Bugs ich einscheusen kann 🙂\n","permalink":"https://playground.christian-gmeiner.info/2009-04-19-pes-parser-rewrite-done/","summary":"\u003cp\u003eHabe soeben mal einen Tree gepusht und darin enthalten ist ein der neue Pes-Parser. Desweiteren habe ich den alten\nSource ordentlich aufgeräumt. Dabei bin ich schon auf die nächste Baustelle getroffen.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecFixedLengthFrame oder warum doppele Datenhaltung\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIm Moment wird aus dem Pes-Stream ein cDxr3PesFrame definiert, welcher wichtige Informationen ala Pes, Payload etc.\nbeinhaltet. Dann wird – unter gewissen Umständen – dieser cDxr3PesFrame in einen cFixedLengthFrame kopiert und im\nSyncBuffer verarbeitet.\u003c/p\u003e","title":"Pes-Parser rewrite done"},{"content":"Hallo zusammen,\nim moment Arbeite ich daran den neuen Pes-Parser in das Plugin zu integrieren. Leider ist das nicht immer so einfach um die Gefahr, neue Bugs zu erzeugen, ist relativ hoch. Ich muss mir langsam auch mal Gedanken machen, wann ich ein Art Beta-Version machen sollte. Ich denke, dass dies noch so lange dauern wird, bis auch das Buffering und Syncing überarbeitet ist.\nNun mal ein Blick in die Vergangenheit 🙂 Ich habe vor mehreren Monaten begonnen, das Plugin von Grundauf neu zu schreiben… unter anderem auch das OSD… ich verwendete zum testen gtkspu und ich denke der Unterschied ist sehr gut sichtbar. Oben der neue OSD Code und unten der alte OSD Code.\nBis diese Änderungen in das Plugin einfließen, werden aber noch ein paar Monate vergehen… da es noch sehr viele andere Dinge zu machen gibt… das wird wohl in einem fast rewritte des Plguins enden.\nDesweiten bin ich im Moment auch mit meiner Master-Arbeit beschäftigt und das hat mehr Prioritäten als alles andere, auch wenn ich an gewissen Tagen lieder etwas anderes machen würde, als mich mit Java und AVR32 auseinander zu setzten.\n","permalink":"https://playground.christian-gmeiner.info/2009-04-15-ein-vergleich-neuer-vs-alter-spu-osd-code/","summary":"\u003cp\u003eHallo zusammen,\u003c/p\u003e\n\u003cp\u003eim moment Arbeite ich daran den neuen Pes-Parser in das Plugin zu integrieren. Leider ist das nicht immer so einfach\num die Gefahr, neue Bugs zu erzeugen, ist relativ hoch. Ich muss mir langsam auch mal Gedanken machen, wann\nich ein Art Beta-Version machen sollte. Ich denke, dass dies noch so lange dauern wird, bis auch das Buffering und Syncing\nüberarbeitet ist.\u003c/p\u003e\n\u003cp\u003eNun mal ein Blick in die Vergangenheit 🙂\nIch habe vor mehreren Monaten begonnen, das Plugin von Grundauf neu zu schreiben… unter anderem auch das OSD… ich verwendete\nzum testen gtkspu und ich denke der Unterschied ist sehr gut sichtbar.  Oben der neue OSD Code und unten der alte OSD Code.\u003c/p\u003e","title":"Ein Vergleich - neuer vs. alter Spu Osd Code"},{"content":"Nachdem ich nun einen schlanken und gut dokumintierten und v.a. funktionierenden Pes-Parser habe, bin ich mir am überlegen, wie ich nun weitermachen sollte. Ich könnte nun Glue-Code dem neuen Pes-Parser hinzufügen und Stück für Stück so weiter machen wie bis her, oder ich mache einfach dies:\ngit rm dxr3syncbuffer.c git rm dxr3syncbuffer.h git rm dxr3demuxdevice.c git rm dxr3demuxdevice.h\nDas ist zwar eine brachialte Art und Weise, doch irgnedwann muss man das Buffering und Syncing neu schreiben. Nun geht es darum, alles wieder ohne Fehler zum compilieren zu bringen und dann das Plugin wieder so funktionstüchtig zu machen wie die 0.2.9 Version. Es werden große Änderungen sein, doch es wird sich auszahlen.\n","permalink":"https://playground.christian-gmeiner.info/2009-03-23-buffering-und-sync/","summary":"\u003cp\u003eNachdem ich nun einen schlanken und gut dokumintierten und v.a. funktionierenden Pes-Parser habe, bin ich\nmir am überlegen, wie ich nun weitermachen sollte. Ich könnte nun Glue-Code  dem neuen Pes-Parser hinzufügen\nund Stück für Stück so weiter machen wie bis her, oder ich mache einfach dies:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit rm dxr3syncbuffer.c\ngit rm dxr3syncbuffer.h\ngit rm dxr3demuxdevice.c\ngit rm dxr3demuxdevice.h\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDas ist zwar eine brachialte Art und Weise, doch irgnedwann muss man das Buffering und Syncing neu schreiben. Nun\ngeht es darum, alles wieder ohne Fehler zum compilieren zu bringen und dann das Plugin wieder so funktionstüchtig zu\nmachen wie die 0.2.9 Version. Es werden große Änderungen sein, doch es wird sich auszahlen.\u003c/p\u003e","title":"Buffering und Sync"},{"content":"Heute habe ich wieder ein wenig Zeit gefunden, um am dxr3 Plugin zu arbeiten und bin im Moment an der PesFrame-Baustelle dran. Der jetzige Source ist leider nicht gerade sehr übersichtlich und verständlich geschrieben. Aus diesem Grund wird die PesFrame KLasse komplett neu geschrieben und nach meiner Einschätzung wesentlich besser zu verstehen und auch von der Laufzeit optimiert, da kein cDxr3SafeArray verwendet wird – wozu auch.\nIch bin mir auch im klaren darüber, dass die jetzige git Version evt nicht so stabil läuft wie die 0.2.9, doch das ist nur normal, wenn man viele Dinge über den Haufen wirft und neu erfindet. Gut Ding brauch seine Zeit.\nPS: Alsa Audioausgabe ist hin und wieder buggy und bei einigen funktioniert garnix – keine Angst, dass steht auch auf meiner TODO 🙂\n","permalink":"https://playground.christian-gmeiner.info/2009-03-23-pesframe-reworking/","summary":"\u003cp\u003eHeute habe ich wieder ein wenig Zeit gefunden, um am dxr3 Plugin zu arbeiten und bin im Moment\nan der PesFrame-Baustelle dran. Der jetzige Source ist leider nicht gerade sehr übersichtlich und\nverständlich geschrieben. Aus diesem Grund wird die PesFrame KLasse komplett neu geschrieben und\nnach meiner Einschätzung wesentlich besser zu verstehen und auch von der Laufzeit optimiert, da kein\ncDxr3SafeArray verwendet wird – wozu auch.\u003c/p\u003e\n\u003cp\u003eIch bin mir auch im klaren darüber, dass die jetzige git Version evt nicht so stabil läuft wie die 0.2.9, doch\ndas ist nur normal, wenn man viele Dinge über den Haufen wirft und neu erfindet. Gut Ding brauch seine Zeit.\u003c/p\u003e","title":"PesFrame reworking"},{"content":"Nachdem das letzte Semester sehr zeitintensiv war fand ich leider sehr wenig Zeit für opensource Projekte. Doch im Moment genieße ich die freie Zeit die zur Verfügung habe und stecke im Moment viel Zeit in das vdr-plugin-dxr3.\nMein großes Ziel ist zum einen Alsa für die Soundausgabe zu unterstützten und zum anderen das Plugin wesentlich stabiler zu machen. Alsa funktioniert schon recht gut, auch wenn es noch Probleme beim Umschalten geben kann und Digital PCM und AC3 noch nicht unterstützt werden. Doch ich bin auf dem richtigen Weg.\nIch bin immer sehr froh über Testberichte 🙂 Die aktuellen Sourcen gibts hier: http://projects.vdr-developer.org/git/?p=vdr-plugin-dxr3.git;a=summary\nIm Moment ist Alsa noch nicht per standard verfügbar, sonder muss in dxr3device.c von Hand aktiviert werden. Am besten nach folgender Zeile ausschau halten:\naudioOut = new cAudioAlsa();\ndiese auskommentieren und die Zeile mit cAudioOss() einkommentieren.\nViel Spaß\n","permalink":"https://playground.christian-gmeiner.info/2009-02-26-alsa-support/","summary":"\u003cp\u003eNachdem das letzte Semester sehr zeitintensiv war fand ich leider sehr wenig Zeit für opensource Projekte.\nDoch im Moment genieße ich die freie Zeit die zur Verfügung habe und stecke im Moment viel Zeit in das\nvdr-plugin-dxr3.\u003c/p\u003e\n\u003cp\u003eMein großes Ziel ist zum einen Alsa für die Soundausgabe zu unterstützten und zum anderen das Plugin\nwesentlich stabiler zu machen.\nAlsa funktioniert schon recht gut, auch wenn es noch Probleme beim Umschalten geben kann und Digital PCM\nund AC3 noch nicht unterstützt werden. Doch ich bin auf dem richtigen Weg.\u003c/p\u003e","title":"Alsa Support"},{"content":"Ich heute zufällig über http://planetkde.org/ auf den Google Treasure Hunt 2008 aufmerksam geworden und habe es natürlich gleich ausprobiert. Ich habe folgende Aufgabe bearbeitet:\n*Unzip the archive, then process the resulting files to obtain a numeric result. You’ll be taking the sum of lines from files matching a certain description, and multiplying those sums together to obtain a final result. Note that files have many different extensions, like ‘.pdf’ and ‘.js’, but all are plain text files containing a small number of lines of text. *\nSum of line 4 for all files with path or name containing BCD and ending in .xml Sum of line 3 for all files with path or name containing EFG and ending in .xml *Hint: If the requested line does not exist, do not increment the sum.\nMultiply all the above sums together and enter the product below. *(Note: Answer must be an exact, decimal representation of the number.)\nMit ein wenig Bash-Scripting ist das auch sehr schnell und einfach lösbar. Viel Spaß beim hacken 🙂\n","permalink":"https://playground.christian-gmeiner.info/2008-11-07-google-treasure-hunt-2008/","summary":"\u003cp\u003eIch heute zufällig über \u003ca href=\"http://planetkde.org/\"\u003ehttp://planetkde.org/\u003c/a\u003e auf den \u003ca href=\"http://treasurehunt.appspot.com\"\u003eGoogle Treasure Hunt 2008\u003c/a\u003e aufmerksam geworden und habe es natürlich gleich ausprobiert. Ich habe folgende Aufgabe bearbeitet:\u003c/p\u003e\n\u003cp\u003e*Unzip the archive, then process the resulting files to obtain a numeric result. You’ll be taking the sum of lines from files matching a certain description, and multiplying those sums together to obtain a final result. Note that files have many different extensions, like ‘.pdf’ and ‘.js’, but all are plain text files containing a small number of lines of text. *\u003c/p\u003e","title":"Google Treasure Hunt 2008"},{"content":"Lange lange ist her, dass das letzte mal etwas geschrieben habe, ich bin einfach nicht der Blogger 🙂 Doch in der Zwischenzeit hat sich einiges getan.\nZum einen hat das nächste Semester des Master-Studiums begonnen und aus diesem Grund habe ich einiges um die Ohren. Angefangen von AVR32 über Simulation und Modellierung bis hin zur IPhone-Programmierung. Doch auch meine Arbeit in der großen Welt des Open-Source ist auch noch da, wenn nicht immer sichtbar. Ich arbeite, wenn ich Zeit finde an allem was mit Dxr3 zu tun hat und sende hier und da ein paar Patches ab. Wenn alles nach meinem Willen geht, sollte der em8300 Treiber irgendwann in den offiziellen Kernel kommen und sich schön in V4l2 integrieren. Doch bis dahin habe ich noch einiges vor mir. Es ist immer wieder schwer, ob ich am Plugin oder am Treiber weiter arbeiten soll, doch das Plugin muss endlich mal raus. Wäre doch schade um die viele Arbeit.. tja.. bald ist wieder mal Wochenende und evt kann ich dann wieder hacken.\nMusikalisch gesehn ist mein Leben auch abwechslungsreich geworden und ich kämpfe immer noch mit den gleichen Problemen. Wie zum Teufel kann ich all meine kreative Engerie gut auf der Gitarre umsetzten und mal ein paar neue Songs meinen Bandmembers zeigen. Ich habe einfach zu viele gute Riffs und Parts im Kopf, sodass ich das Problem habe nicht alle in einen Song packen zu können. Tja.. thats live.\n","permalink":"https://playground.christian-gmeiner.info/2008-10-27-jaja-ich-schreib-auch-wieder-mal-was/","summary":"\u003cp\u003eLange lange ist her, dass das letzte mal etwas geschrieben habe, ich bin einfach nicht der Blogger 🙂\nDoch in der Zwischenzeit hat sich einiges getan.\u003c/p\u003e\n\u003cp\u003eZum einen hat das nächste Semester des Master-Studiums begonnen und aus diesem Grund habe ich einiges um die Ohren. Angefangen von AVR32 über Simulation und Modellierung bis hin zur IPhone-Programmierung. Doch auch meine Arbeit in der großen Welt des Open-Source ist auch noch da, wenn nicht immer sichtbar. Ich arbeite, wenn ich Zeit finde an allem was mit Dxr3 zu tun hat und sende hier und da ein paar Patches ab. Wenn alles nach meinem Willen geht, sollte der em8300 Treiber irgendwann in den offiziellen Kernel kommen und sich schön in V4l2 integrieren. Doch bis dahin habe ich noch einiges vor mir. Es ist immer wieder schwer, ob ich am Plugin oder am Treiber weiter arbeiten soll, doch das Plugin muss endlich mal raus. Wäre doch schade um die viele Arbeit.. tja.. bald ist wieder mal Wochenende und evt kann ich dann wieder hacken.\u003c/p\u003e","title":"Jaja... ich schreib auch wieder mal was"},{"content":"Endlich ist es geschafft… ein 4Fraben Osd wird mit dem neuen OSD Code des Dxr3-Plugins angezeigt. Der verwendete Source ist noch recht voll mit Debug-Stuff und ist auch noch vom Softwaredesign schlecht. Das möchte ich aber in den kommenden Tagen ändern. Das neue OSD wird auf alle Fälle besser als das alte.\n","permalink":"https://playground.christian-gmeiner.info/2008-07-31-spuencoder/","summary":"\u003cp\u003eEndlich ist es geschafft… ein 4Fraben Osd wird mit dem neuen OSD Code des Dxr3-Plugins angezeigt. Der\nverwendete Source ist noch recht voll mit Debug-Stuff und ist auch noch vom Softwaredesign schlecht.\nDas möchte ich aber in den kommenden Tagen ändern. Das neue OSD wird auf alle Fälle besser als das alte.\u003c/p\u003e","title":"SpuEncoder"},{"content":"Leider bin ich schon lange nicht mehr dazu gekommen um ein wenig was zu schreiben. Doch nun endlich ist dieser Moment gekommen 🙂\nEs sind Ferien und man hat hin und wieder Zeit ein wenig was zu programmieren… das Dxr3-Plugin ist fast so weit, dass das OSD funktioniert. Ich habe das OSD-Bitmap mit rle encoded, habe das OSD in Regionen zu max 4 Farben aufgeteilt und kenne auch schon das DVD Subtitle Format recht gut, doch es ist einfach noch nichts zu sehen… entweder habe ich noch was vergessen oder das erstellte Paket ist $%@%.\nBis in 4-5 Tagen sollte dann endlich alles so weit sein, dass ich die erste Alpha der 0.3 er Serie announcen werde.\n/me geht jetzt mal an die frische Luft\n","permalink":"https://playground.christian-gmeiner.info/2008-07-25-0x00-und-andere-dinge/","summary":"\u003cp\u003eLeider bin ich schon lange nicht mehr dazu gekommen um ein wenig was zu schreiben. Doch nun endlich\nist dieser Moment gekommen 🙂\u003c/p\u003e\n\u003cp\u003eEs sind Ferien und man hat hin und wieder Zeit ein wenig was zu programmieren… das Dxr3-Plugin ist fast so weit, dass das OSD funktioniert. Ich habe das OSD-Bitmap mit rle encoded, habe das OSD in Regionen zu max 4 Farben aufgeteilt und kenne auch schon das DVD Subtitle Format recht gut, doch\nes ist einfach noch nichts zu sehen… entweder habe ich noch was vergessen oder das erstellte Paket ist $%@%.\u003c/p\u003e","title":"0x00 und andere Dinge"},{"content":"In den letzten Tagen und Wochen war ich recht fleißig und habe weiter an der audiohw API gearbeitet. Mittlerweile ist es mir gelungen die ifdef-hell ein wenig zu säubern und den Code dadurch wesentlich übersichtlicher zu machen. In den nächsten Wochen möchte ich gerne folgende Punkte erledigen:\nPrüfen ob audio_is_initialized überhaupt benötigt wird Eine elegante Lösung für set_prescaled_volume finden (audiohw_set_volume(l, r)) Einige Sainty-Checks einbauen, ob eine bestimmte AUDIOHW_CAPS Kombination ok ist sound_val2phys in die Audio-Codec Treiber auslagern Für die cutoff Funktionen eigene CAPS definieren und verwenden Support für 1.5 DB Schritte verbessern sound_set_loudness und Co in den mas35xx Treiber verschieben Den DSP für den Simulator verwenden Es ist zwar eine lange Liste, doch ich bin nicht unter Zeitdruck 😉\n","permalink":"https://playground.christian-gmeiner.info/2008-05-15-soundc-und-die-audiohw-api/","summary":"\u003cp\u003eIn den letzten Tagen und Wochen war ich recht fleißig und habe weiter an der audiohw API gearbeitet. Mittlerweile ist es mir\ngelungen die ifdef-hell ein wenig zu säubern und den Code dadurch wesentlich übersichtlicher zu machen.\nIn den nächsten Wochen möchte ich gerne folgende Punkte erledigen:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePrüfen ob \u003cem\u003eaudio_is_initialized\u003c/em\u003e überhaupt benötigt wird\u003c/li\u003e\n\u003cli\u003eEine elegante Lösung für \u003cem\u003eset_prescaled_volume\u003c/em\u003e finden (audiohw_set_volume(l, r))\u003c/li\u003e\n\u003cli\u003eEinige Sainty-Checks einbauen, ob eine bestimmte AUDIOHW_CAPS Kombination ok ist\u003c/li\u003e\n\u003cli\u003e\u003cem\u003esound_val2phys\u003c/em\u003e in die Audio-Codec Treiber auslagern\u003c/li\u003e\n\u003cli\u003eFür die cutoff Funktionen eigene CAPS definieren und verwenden\u003c/li\u003e\n\u003cli\u003eSupport für 1.5 DB Schritte verbessern\u003c/li\u003e\n\u003cli\u003e\u003cem\u003esound_set_loudness\u003c/em\u003e und Co in den mas35xx Treiber verschieben\u003c/li\u003e\n\u003cli\u003eDen DSP für den Simulator verwenden\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEs ist zwar eine lange Liste, doch ich bin nicht unter Zeitdruck 😉\u003c/p\u003e","title":"sound.c und die audiohw api"},{"content":"Ich hatte gerade das Problem, dass die MCP61 rev a2 keinen Ton von sich gab. Es handelt sich dabei um ein Biostar NF61S-M2A Mainboard. Um nun die Onboard Soundkarte zur Kooperation zu bewegen, muss man einfach den Intel HDA Treiber verwenden und diese Zeilen in die /etc/modprobe.conf einfügen:\noptions snd-hda-intel enable=1 index=0 alias snd-card-0 snd-hda-intel options snd-hda-intel model=6stack\nHappy Hacking\n","permalink":"https://playground.christian-gmeiner.info/2008-05-06-audio-device-nvidia-corporation-mcp61-high-definition-audio-rev-a2/","summary":"\u003cp\u003eIch hatte gerade das Problem, dass die MCP61 rev a2 keinen Ton von sich gab. Es handelt sich dabei um ein \u003cstrong\u003eBiostar NF61S-M2A\u003c/strong\u003e Mainboard. Um nun die Onboard Soundkarte zur Kooperation zu bewegen, muss man einfach den \u003cstrong\u003eIntel HDA\u003c/strong\u003e Treiber verwenden und diese Zeilen in die \u003cstrong\u003e/etc/modprobe.conf\u003c/strong\u003e einfügen:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eoptions snd-hda-intel enable=1 index=0\nalias snd-card-0 snd-hda-intel\noptions snd-hda-intel model=6stack\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eHappy Hacking\u003c/p\u003e","title":"Audio device: nVidia Corporation MCP61 High Definition Audio (rev a2)"},{"content":"Nachdem ich nun meinen Arbeitsrechner neu aufgesetzt habe, dachte ich mir, dass gleich auch noch OpenRC probieren könnte. Mit Hilfe des Migration Guide verlief die Umstellung ohne Probleme und der erste Boot mit OpenRC wurde ausgeführt. Und ich bin sehr erstaunt wie einfach alles ging und das gute an der ganzen Sache… das System startet schneller 🙂\nNachdem mein Arbeitsrechner nun wieder online ist, werde ich weiter an meinen Projekten arbeiten und hin und wider mal blogen.\n","permalink":"https://playground.christian-gmeiner.info/2008-04-15-openrc/","summary":"\u003cp\u003eNachdem ich nun meinen Arbeitsrechner neu aufgesetzt habe, dachte ich mir, dass gleich auch noch OpenRC probieren könnte. Mit Hilfe des \u003ca href=\"http://www.gentoo.org/doc/en/openrc-migration.xml\"\u003eMigration Guide\u003c/a\u003e verlief die Umstellung ohne Probleme und der erste Boot mit OpenRC wurde ausgeführt. Und ich bin sehr erstaunt wie einfach alles ging und das gute an der ganzen Sache… das System startet schneller 🙂\u003c/p\u003e\n\u003cp\u003eNachdem mein Arbeitsrechner nun wieder online ist, werde ich weiter an meinen Projekten arbeiten und hin und wider mal blogen.\u003c/p\u003e","title":"OpenRC"},{"content":"Usage: vdr [OPTIONS]\n…\nPlugins: vdr -P”name [OPTIONS]”\ndxr3 (0.3.0_rc1) – em8300 based output device\n-v {pal/ntsc} –videosystem {pal/ntsc} video system to use default: pal\n","permalink":"https://playground.christian-gmeiner.info/2008-03-29-vdr-h/","summary":"\u003cp\u003eUsage: vdr [OPTIONS]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e…\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePlugins: vdr -P”name [OPTIONS]”\u003c/p\u003e\n\u003cp\u003edxr3 (0.3.0_rc1) – em8300 based output device\u003c/p\u003e\n\u003cp\u003e-v {pal/ntsc}                –videosystem {pal/ntsc}                 video system to use\ndefault: pal\u003c/p\u003e","title":"vdr -h"},{"content":"Hallo zusammen,\nhabe heute ein wenig Zeit gefunden, und habe nun einen Lippen-Synchronen Ton mit passendem Bild 🙂 Leider ist der A/V-Sync Code noch nicht sehr ausgereift und deswegen geht beim Umschalten entweder Bild oder Ton verloren. Das ‘Problem’ sollte ich über das Wochenende gefixt haben und dann kann ich wieder einen Punkt aus meiner ToDo streichen.\nAls nächstes werde ich entweder das OSD angehen, oder eine Infrastruktur entwickeln, damit der GrabImage-API Aufruf funktioniert bzw das Spektrum-Analyser PCM-Daten vom Plugin bekommt.\nEin Valgrind-Test könnte evt auch nicht schaden und ja.. ein das Plugin crasht beim beenden des VDR’s noch.. wird noch ein wenig dauern, bis ich Tester brauche und meine Quellen in den SVN auf sourceforge hochladen werde.\nStay tuned\n","permalink":"https://playground.christian-gmeiner.info/2008-03-28-dxr3-plugin-030-progress/","summary":"\u003cp\u003eHallo zusammen,\u003c/p\u003e\n\u003cp\u003ehabe heute ein wenig Zeit gefunden, und habe nun einen Lippen-Synchronen Ton mit passendem Bild 🙂\nLeider ist der A/V-Sync Code noch nicht sehr ausgereift und deswegen geht beim Umschalten entweder Bild\noder Ton verloren. Das ‘Problem’ sollte ich über das Wochenende gefixt haben und dann kann ich wieder\neinen Punkt aus meiner ToDo streichen.\u003c/p\u003e\n\u003cp\u003eAls nächstes werde ich entweder das OSD angehen, oder eine Infrastruktur entwickeln, damit der \u003cem\u003eGrabImage\u003c/em\u003e-API\nAufruf funktioniert bzw das Spektrum-Analyser PCM-Daten vom Plugin bekommt.\u003c/p\u003e","title":"dxr3-plugin 0.3.0 progress"},{"content":"Mittlerweile läuft meine Version des Dxr3 Plugins recht gut. Es gibt noch ein paar Probleme mit dem A/V Sync. Im Moment arbeite ich an einem neuen OSD und SpuEncoder Teil, bei dem ich schon einige Fortschritte gemacht habe. Zum einen funktioniert die RLE Kodierung der SPU-Pixelwerte und das mit Hilfe von std::bitset\u0026lt;\u0026gt; und zum anderen habe ich dsa Prinzip hinter der Funktionsweise des OSD’s komplett verstanden.\nNachdem A/V Sync gefixt ist und das OSD funktioniert habe ich folgendes noch auf meiner Liste (ausschnitt. nicht sortiert nach Prio)\nFrabwerte mittels OSD einstellen ImageGrab –\u0026gt; irgendwann soll mein Atmo auch gehen PCM-Source für das Spectrum-Analyzer Plugin i18n Ich hoffe ich finde die nächsten Tage viel Zeit für dieses Projekt…\n","permalink":"https://playground.christian-gmeiner.info/2008-03-05-av-syncronization/","summary":"\u003cp\u003eMittlerweile läuft meine Version des Dxr3 Plugins recht gut. Es gibt noch ein paar Probleme mit dem A/V Sync. Im Moment arbeite ich an einem neuen OSD und SpuEncoder Teil, bei dem ich schon einige Fortschritte gemacht habe. Zum einen funktioniert die RLE\nKodierung der SPU-Pixelwerte und das mit Hilfe von std::bitset\u0026lt;\u0026gt; und zum anderen habe ich dsa Prinzip hinter der Funktionsweise des\nOSD’s komplett verstanden.\u003c/p\u003e\n\u003cp\u003eNachdem A/V Sync gefixt ist und das OSD funktioniert habe ich folgendes noch auf meiner Liste (ausschnitt. nicht sortiert nach Prio)\u003c/p\u003e","title":"A/V Syncronization"},{"content":"Nachdem ich schon seit eingier Zeit an einer neuen Version des VDR Plugins abreite, habe ich die letzten Tage sehr viel Zeit zum programmieren gefunden und habe das Dxr3 Plugin komplett neu geschrieben. Im Moment arbeite ich am A/V sync, und sonst noch ein paar Goodies.\nHier mal ein kleiner Vorgeschmack:\nFeb 26 14:44:59 vdr vdr: [24405] initializing plugin: dxr3 (0.3.0_rc1): TODO Feb 26 14:44:59 vdr vdr: [24405] [dxr3-decoder] using avcodec/ffmpeg version 3352580 build 3352580 Feb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ready… Feb 26 14:44:59 vdr vdr: [24405] ERROR: /dev/em8300_ma-0: Datei oder Verzeichnis nicht gefunden Feb 26 14:44:59 vdr vdr: [24405] [dxr3-output-audio] using alsa driver Feb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021127 on 0 with result 0 Feb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074545410 on 0 with result 0 Feb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021126 on 0 with result 0 Feb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021137 on 0 with result 0 Feb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021136 on 0 with result 0 Feb 26 14:44:59 vdr vdr: [24405] initializing plugin: live (0.1.0): Live Interactive VDR Environment Feb 26 14:44:59 vdr vdr: [24405] setting primary device to 2 Feb 26 14:44:59 vdr vdr: [24412] Audio-Output Thread (dxr3) thread started (pid=24405, tid=24412) Feb 26 14:44:59 vdr vdr: [24413] Video-Output Thread (dxr3) thread started (pid=24405, tid=24413) Feb 26 14:44:59 vdr vdr: [24405] assuming manual start of VDR Feb 26 14:44:59 vdr vdr: [24405] SVDRP listening on port 2001 Feb 26 14:44:59 vdr vdr: [24405] setting current skin to “sttng” Feb 26 14:44:59 vdr vdr: [24405] loading /etc/vdr//themes/sttng-default.theme Feb 26 14:44:59 vdr vdr: [24405] starting plugin: dxr3 Feb 26 14:44:59 vdr vdr: [24405] starting plugin: live Feb 26 14:44:59 vdr vdr: [24405] LIVE: initial file cache has 82 entries and needs 300358 bytes of data! Feb 26 14:44:59 vdr vdr: [24416] KBD remote control thread started (pid=24405, tid=24416) Feb 26 14:44:59 vdr vdr: [24405] remote control KBD – learning keys Feb 26 14:44:59 vdr vdr: [24405] ERROR: no OSD provider available – using dummy OSD! Feb 26 14:45:01 vdr vdr: [24409] CAM 1: no module present Feb 26 14:45:09 vdr vdr: [24405] switching to channel 2 Feb 26 14:45:09 vdr vdr: [24424] transfer thread started (pid=24405, tid=24424) Feb 26 14:45:09 vdr vdr: [24425] receiver on device 1 thread started (pid=24405, tid=24425) Feb 26 14:45:09 vdr vdr: [24426] TS buffer on device 1 thread started (pid=24405, tid=24426) Feb 26 14:45:09 vdr vdr: [24405] ERROR: no OSD provider available – using dummy OSD! Feb 26 14:45:09 vdr vdr: [24405] live reloading timers Feb 26 14:45:10 vdr vdr: [24413] [dxr3-output] starting Feb 26 14:45:10 vdr vdr: [24424] setting audio track to 1 (0) Feb 26 14:45:10 vdr vdr: [24424] [dxr3-audio-alsa] switching to analog audio Feb 26 14:45:10 vdr vdr: [24412] [dxr3-output] starting Feb 26 14:45:10 vdr vdr: [24412] [dxr-audio-alsa] changing samplerate to 48000 (old 0) Feb 26 14:45:10 vdr vdr: [24412] [dxr-audio-alsa] changing num of channels to 2 (old 0)\n","permalink":"https://playground.christian-gmeiner.info/2008-02-26-dxr3-plugin-030/","summary":"\u003cp\u003eNachdem ich schon seit eingier Zeit an einer neuen Version des VDR Plugins abreite, habe ich die letzten Tage sehr viel Zeit zum\nprogrammieren gefunden und habe  das Dxr3  Plugin komplett neu geschrieben. Im Moment arbeite ich am A/V sync, und sonst noch\nein paar Goodies.\u003c/p\u003e\n\u003cp\u003eHier mal ein kleiner Vorgeschmack:\u003c/p\u003e\n\u003cp\u003eFeb 26 14:44:59 vdr vdr: [24405] initializing plugin: dxr3 (0.3.0_rc1): TODO\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-decoder] using avcodec/ffmpeg version 3352580 build 3352580\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ready…\nFeb 26 14:44:59 vdr vdr: [24405] ERROR: /dev/em8300_ma-0: Datei oder Verzeichnis nicht gefunden\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-output-audio] using alsa driver\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021127 on 0 with result 0\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074545410 on 0 with result 0\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021126 on 0 with result 0\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021137 on 0 with result 0\nFeb 26 14:44:59 vdr vdr: [24405] [dxr3-interface] ioctl 1074021136 on 0 with result 0\nFeb 26 14:44:59 vdr vdr: [24405] initializing plugin: live (0.1.0): Live Interactive VDR Environment\nFeb 26 14:44:59 vdr vdr: [24405] setting primary device to 2\nFeb 26 14:44:59 vdr vdr: [24412] Audio-Output Thread (dxr3) thread started (pid=24405, tid=24412)\nFeb 26 14:44:59 vdr vdr: [24413] Video-Output Thread (dxr3) thread started (pid=24405, tid=24413)\nFeb 26 14:44:59 vdr vdr: [24405] assuming manual start of VDR\nFeb 26 14:44:59 vdr vdr: [24405] SVDRP listening on port 2001\nFeb 26 14:44:59 vdr vdr: [24405] setting current skin to “sttng”\nFeb 26 14:44:59 vdr vdr: [24405] loading /etc/vdr//themes/sttng-default.theme\nFeb 26 14:44:59 vdr vdr: [24405] starting plugin: dxr3\nFeb 26 14:44:59 vdr vdr: [24405] starting plugin: live\nFeb 26 14:44:59 vdr vdr: [24405] LIVE: initial file cache has 82 entries and needs 300358 bytes of data!\nFeb 26 14:44:59 vdr vdr: [24416] KBD remote control thread started (pid=24405, tid=24416)\nFeb 26 14:44:59 vdr vdr: [24405] remote control KBD – learning keys\nFeb 26 14:44:59 vdr vdr: [24405] ERROR: no OSD provider available – using dummy OSD!\nFeb 26 14:45:01 vdr vdr: [24409] CAM 1: no module present\nFeb 26 14:45:09 vdr vdr: [24405] switching to channel 2\nFeb 26 14:45:09 vdr vdr: [24424] transfer thread started (pid=24405, tid=24424)\nFeb 26 14:45:09 vdr vdr: [24425] receiver on device 1 thread started (pid=24405, tid=24425)\nFeb 26 14:45:09 vdr vdr: [24426] TS buffer on device 1 thread started (pid=24405, tid=24426)\nFeb 26 14:45:09 vdr vdr: [24405] ERROR: no OSD provider available – using dummy OSD!\nFeb 26 14:45:09 vdr vdr: [24405] live reloading timers\nFeb 26 14:45:10 vdr vdr: [24413] [dxr3-output] starting\nFeb 26 14:45:10 vdr vdr: [24424] setting audio track to 1 (0)\nFeb 26 14:45:10 vdr vdr: [24424] [dxr3-audio-alsa] switching to analog audio\nFeb 26 14:45:10 vdr vdr: [24412] [dxr3-output] starting\nFeb 26 14:45:10 vdr vdr: [24412] [dxr-audio-alsa] changing samplerate to 48000 (old 0)\nFeb 26 14:45:10 vdr vdr: [24412] [dxr-audio-alsa] changing num of channels to 2 (old 0)\u003c/p\u003e","title":"Dxr3-Plugin 0.3.0"},{"content":"Im Moment nutze ich meine Freizeit um die AudioHw-Schicht in Rockbox ein wenig aufzuräumen und v.a. firmware/sound.c aufzuräumen und zu vereinfachen.\nHier einmal die großen Ziele von diesem Projekt:\nEigener Audio-Treiber für die zwei Mas-Codec Einfache Möglichkeit um für ein Codec zu definieren was es alles in Hardware machen kann Z.b.: Bass, Prescaler,… Einheitliches Interface um die Lautstärke zu regulieren –\u0026gt; audiohw_set_volume(l, r) Preinit/Postinit aufräume Eine sehr große Liste, doch sollte machbar sein. Ich freue mich schon auf ein paar Stunden Programmierarbeit.\n","permalink":"https://playground.christian-gmeiner.info/2008-02-14-audiohw-unification/","summary":"\u003cp\u003eIm Moment nutze ich meine Freizeit um die AudioHw-Schicht in Rockbox ein wenig aufzuräumen und v.a. firmware/sound.c aufzuräumen und zu vereinfachen.\u003c/p\u003e\n\u003cp\u003eHier einmal die großen Ziele von diesem Projekt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEigener Audio-Treiber für die zwei Mas-Codec\u003c/li\u003e\n\u003cli\u003eEinfache Möglichkeit um für ein Codec zu definieren was es alles in Hardware machen kann\nZ.b.: Bass, Prescaler,…\u003c/li\u003e\n\u003cli\u003eEinheitliches Interface um die Lautstärke zu regulieren –\u0026gt; audiohw_set_volume(l, r)\u003c/li\u003e\n\u003cli\u003ePreinit/Postinit aufräume\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEine sehr große Liste, doch sollte machbar sein. Ich freue mich schon auf ein paar Stunden Programmierarbeit.\u003c/p\u003e","title":"AudioHw Unification"},{"content":"is equired for intltool.\nDieser Fehler bekam ich bei einem Update des NetworkManager’s unter Gentoo. Scheinbar ist hängt dies mit Perl, intltool und dem xml parser zusammen. Für mehr Informationen einfach einen Blick auf https://bugs.gentoo.org/show_bug.cgi?id=41124\nUnd hier nun die sehr einfache Lösung – works for me(tm)\nemerge XML-Parser networkmanger\nHappy Hacking..\n","permalink":"https://playground.christian-gmeiner.info/2008-02-14-checking-for-xmlparser-configure-error-xmlparser-perl-module/","summary":"\u003cp\u003eis equired for intltool.\u003c/p\u003e\n\u003cp\u003eDieser Fehler bekam ich bei einem Update des NetworkManager’s unter Gentoo. Scheinbar ist hängt dies mit Perl, intltool und dem xml parser zusammen. Für mehr Informationen einfach einen Blick auf \u003ca href=\"https://bugs.gentoo.org/show_bug.cgi?id=41124\" title=\"Gentoo Bugs\"\u003ehttps://bugs.gentoo.org/show_bug.cgi?id=41124\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eUnd hier nun die sehr einfache Lösung – works for me(tm)\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eemerge  XML-Parser networkmanger\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eHappy Hacking..\u003c/p\u003e","title":"checking for XML::Parser... configure: error: XML::Parser perl module..."},{"content":"Welcher Star Wars-Fan und Geek wollte nich nie Star Wars ala Ascii-Art sehen?! So einfach funktioniert es: telnet towel.blinkenlights.nl\n","permalink":"https://playground.christian-gmeiner.info/2008-01-16-star-wars/","summary":"\u003cp\u003eWelcher Star Wars-Fan und Geek wollte nich nie Star Wars ala Ascii-Art sehen?!\nSo einfach funktioniert es: telnet towel.blinkenlights.nl\u003c/p\u003e","title":"Star Wars..."},{"content":"…\nIch spiele im Moment mit dem Gedanken bei der Entwicklung von KDE aktiv mitzuwirken. Wäre auf jeden Fall keine schlechte Idee, da ein so grosses Projekt nie genug fähige Programmierer, Artiests, … haben kann.\n","permalink":"https://playground.christian-gmeiner.info/2008-01-11-ein-schoner-tag/","summary":"\u003cp\u003e…\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://kde.org/img/kde40.png\"\u003e\u003c/p\u003e\n\u003cp\u003eIch spiele im Moment mit dem Gedanken bei der Entwicklung von KDE aktiv mitzuwirken. Wäre auf jeden Fall keine schlechte Idee, da ein so grosses\nProjekt nie genug fähige  Programmierer,  Artiests, … haben kann.\u003c/p\u003e","title":"Ein schöner Tag..."},{"content":"Wie ich auf der Seite von linuxdriverproject sehen kann, schein das M-Audio 49e midi-keyboard und Linux nicht zu funktionieren. Dem kann ich nicht zustimmen und werde hier ein kleines HowTo posten.\nAls ersten einmal die Ausgabe von lsusb -vvv: Bus 002 Device 012: ID 0a4d:0090 Evolution Electronics, Ltd Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0a4d Evolution Electronics, Ltd idProduct 0x0090 bcdDevice 1.13 iManufacturer 1 Evolution Electronics Ltd. iProduct 2 USB Keystation 49e iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 101 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 3 Audio Class bmAttributes 0xc0 Self Powered MaxPower 0mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 1 Control Device bInterfaceProtocol 0 iInterface 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 1 (HEADER) bcdADC 1.00 wTotalLength 9 bInCollection 1 baInterfaceNr( 0) 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 1 Audio bInterfaceSubClass 3 MIDI Streaming bInterfaceProtocol 0 iInterface 0 MIDIStreaming Interface Descriptor: bLength 7 bDescriptorType 36 bDescriptorSubtype 1 (HEADER) bcdADC 1.00 wTotalLength 65 MIDIStreaming Interface Descriptor: bLength 6 bDescriptorType 36 bDescriptorSubtype 2 (MIDI_IN_JACK) bJackType 1 Embedded bJackID 1 iJack 0 MIDIStreaming Interface Descriptor: bLength 6 bDescriptorType 36 bDescriptorSubtype 2 (MIDI_IN_JACK) bJackType 2 External bJackID 2 iJack 0 MIDIStreaming Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 3 (MIDI_OUT_JACK) bJackType 1 Embedded bJackID 3 bNrInputPins 1 baSourceID( 0) 2 BaSourcePin( 0) 1 iJack 0 MIDIStreaming Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 3 (MIDI_OUT_JACK) bJackType 2 External bJackID 4 bNrInputPins 1 baSourceID( 0) 1 BaSourcePin( 0) 1 iJack 0 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 bRefresh 0 bSynchAddress 0 MIDIStreaming Endpoint Descriptor: bLength 5 bDescriptorType 37 bDescriptorSubtype 1 (GENERAL) bNumEmbMIDIJack 1 baAssocJackID( 0) 3 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 bRefresh 0 bSynchAddress 0 MIDIStreaming Endpoint Descriptor: bLength 5 bDescriptorType 37 bDescriptorSubtype 1 (GENERAL) bNumEmbMIDIJack 1 baAssocJackID( 0) 1 Device Status: 0x0000 (Bus Powered)\nNun einmal die Ausgabe von dmesg beim Einstecken des Keyboards: usb 2-6: new full speed USB device using ohci_hcd and address 14 ohci_hcd 0000:00:0a.0: GetStatus roothub.portstatus [5] = 0x00100103 PRSC PPS PES CCS usb 2-6: skipped 1 descriptor after interface usb 2-6: skipped 5 descriptors after interface usb 2-6: skipped 1 descriptor after endpoint usb 2-6: skipped 1 descriptor after endpoint usb 2-6: default language 0x0409 usb 2-6: new device strings: Mfr=1, Product=2, SerialNumber=0 usb 2-6: Product: USB Keystation 49e usb 2-6: Manufacturer: Evolution Electronics Ltd. usb 2-6: uevent usb 2-6: usb_probe_device usb 2-6: configuration #1 chosen from 1 choice usb 2-6: adding 2-6:1.0 (config #1, interface 0) usb 2-6:1.0: uevent usb 2-6:1.0: uevent snd-usb-audio 2-6:1.0: usb_probe_interface snd-usb-audio 2-6:1.0: usb_probe_interface – got id usb 2-6: adding 2-6:1.1 (config #1, interface 1) usb 2-6:1.1: uevent usb 2-6:1.1: uevent drivers/usb/core/inode.c: creating file ‘014’ hub 2-0:1.0: state 7 ports 10 chg 0000 evt 0040\nDie Konfiguration des Kernels Ist eigentlich sehr sehr einfach. Man muss nur **Device Drivers/Sound/Advanced Linux Sound Architecture/USB Devices/USB Audio/MIDI driver **als Modul oder fest in den Kernel kompilieren.\nSchon kann man mit dem Midi-Keyboard in wine und nativ arbeiten, z.B. mit rosegarden.\n","permalink":"https://playground.christian-gmeiner.info/2008-01-07-m-audio-keystation-49e-usb-midi-keyboard/","summary":"\u003cp\u003eWie ich auf der Seite von linuxdriverproject sehen kann, schein das M-Audio 49e midi-keyboard und Linux nicht zu funktionieren. Dem kann ich nicht zustimmen und werde hier ein kleines HowTo posten.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAls ersten einmal die Ausgabe von \u003cem\u003elsusb -vvv\u003c/em\u003e:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBus 002 Device 012: ID 0a4d:0090 Evolution Electronics, Ltd\nDevice Descriptor:\nbLength 18\nbDescriptorType 1\nbcdUSB 1.00\nbDeviceClass 0 (Defined at Interface level)\nbDeviceSubClass 0\nbDeviceProtocol 0\nbMaxPacketSize0 64\nidVendor 0x0a4d Evolution Electronics, Ltd\nidProduct 0x0090\nbcdDevice 1.13\niManufacturer 1 Evolution Electronics Ltd.\niProduct 2 USB Keystation 49e\niSerial 0\nbNumConfigurations 1\nConfiguration Descriptor:\nbLength 9\nbDescriptorType 2\nwTotalLength 101\nbNumInterfaces 2\nbConfigurationValue 1\niConfiguration 3 Audio Class\nbmAttributes 0xc0\nSelf Powered\nMaxPower 0mA\nInterface Descriptor:\nbLength 9\nbDescriptorType 4\nbInterfaceNumber 0\nbAlternateSetting 0\nbNumEndpoints 0\nbInterfaceClass 1 Audio\nbInterfaceSubClass 1 Control Device\nbInterfaceProtocol 0\niInterface 0\nAudioControl Interface Descriptor:\nbLength 9\nbDescriptorType 36\nbDescriptorSubtype 1 (HEADER)\nbcdADC 1.00\nwTotalLength 9\nbInCollection 1\nbaInterfaceNr( 0) 1\nInterface Descriptor:\nbLength 9\nbDescriptorType 4\nbInterfaceNumber 1\nbAlternateSetting 0\nbNumEndpoints 2\nbInterfaceClass 1 Audio\nbInterfaceSubClass 3 MIDI Streaming\nbInterfaceProtocol 0\niInterface 0\nMIDIStreaming Interface Descriptor:\nbLength 7\nbDescriptorType 36\nbDescriptorSubtype 1 (HEADER)\nbcdADC 1.00\nwTotalLength 65\nMIDIStreaming Interface Descriptor:\nbLength 6\nbDescriptorType 36\nbDescriptorSubtype 2 (MIDI_IN_JACK)\nbJackType 1 Embedded\nbJackID 1\niJack 0\nMIDIStreaming Interface Descriptor:\nbLength 6\nbDescriptorType 36\nbDescriptorSubtype 2 (MIDI_IN_JACK)\nbJackType 2 External\nbJackID 2\niJack 0\nMIDIStreaming Interface Descriptor:\nbLength 9\nbDescriptorType 36\nbDescriptorSubtype 3 (MIDI_OUT_JACK)\nbJackType 1 Embedded\nbJackID 3\nbNrInputPins 1\nbaSourceID( 0) 2\nBaSourcePin( 0) 1\niJack 0\nMIDIStreaming Interface Descriptor:\nbLength 9\nbDescriptorType 36\nbDescriptorSubtype 3 (MIDI_OUT_JACK)\nbJackType 2 External\nbJackID 4\nbNrInputPins 1\nbaSourceID( 0) 1\nBaSourcePin( 0) 1\niJack 0\nEndpoint Descriptor:\nbLength 9\nbDescriptorType 5\nbEndpointAddress 0x81 EP 1 IN\nbmAttributes 2\nTransfer Type Bulk\nSynch Type None\nUsage Type Data\nwMaxPacketSize 0x0040 1x 64 bytes\nbInterval 0\nbRefresh 0\nbSynchAddress 0\nMIDIStreaming Endpoint Descriptor:\nbLength 5\nbDescriptorType 37\nbDescriptorSubtype 1 (GENERAL)\nbNumEmbMIDIJack 1\nbaAssocJackID( 0) 3\nEndpoint Descriptor:\nbLength 9\nbDescriptorType 5\nbEndpointAddress 0x02 EP 2 OUT\nbmAttributes 2\nTransfer Type Bulk\nSynch Type None\nUsage Type Data\nwMaxPacketSize 0x0040 1x 64 bytes\nbInterval 0\nbRefresh 0\nbSynchAddress 0\nMIDIStreaming Endpoint Descriptor:\nbLength 5\nbDescriptorType 37\nbDescriptorSubtype 1 (GENERAL)\nbNumEmbMIDIJack 1\nbaAssocJackID( 0) 1\nDevice Status: 0x0000\n(Bus Powered)\u003c/p\u003e","title":"M-Audio Keystation 49e USB midi-keyboard"},{"content":"\n","permalink":"https://playground.christian-gmeiner.info/2007-12-11-kde-4/","summary":"\u003cp\u003e\u003cimg alt=\"KDE 4.0 Release Counter\" loading=\"lazy\" src=\"http://games.kde.org/new/counter/\"\u003e\u003c/p\u003e","title":"KDE 4"},{"content":"Nachdem ein neuer Stack meine alten USB-Stack, welcher im Google Summer of Code für RockBox erstellt wurde, durch einen wenig objektorientierten und nicht so generischen USB-Stack ersetzt wurde, habe ich in weniger als 20 Minuten einen serial Treiber geschrieben. Leider ist der neue Stack noch fertig und es fehlt eine wichtige Funktionalität: Umschalten zwischen verschieden device Treibern zur Laufzeit… bald ist ja Wochenende.\nRevision 15850 rockt 🙂\nmodprobe usbserial vendor=0x0781 product=0x7421 debug=1 picocom /dev/ttyUSB0 ","permalink":"https://playground.christian-gmeiner.info/2007-11-30-serial-over-usb/","summary":"\u003cp\u003eNachdem ein neuer Stack meine alten USB-Stack, welcher im Google Summer of Code für \u003ca href=\"http://www.rockbox.org\"\u003eRockBox\u003c/a\u003e erstellt wurde, durch einen wenig objektorientierten und nicht so generischen USB-Stack ersetzt wurde, habe ich in weniger als 20 Minuten einen serial Treiber geschrieben.  Leider ist der neue Stack noch fertig und es fehlt eine wichtige Funktionalität: Umschalten zwischen verschieden device Treibern zur Laufzeit… bald ist ja Wochenende.\u003c/p\u003e\n\u003cp\u003eRevision 15850 rockt 🙂\u003c/p\u003e\n\u003ch1 id=\"modprobe-usbserial-vendor0x0781-product0x7421-debug1\"\u003emodprobe usbserial vendor=0x0781 product=0x7421 debug=1\u003c/h1\u003e\n\u003ch1 id=\"picocom-devttyusb0\"\u003epicocom /dev/ttyUSB0\u003c/h1\u003e","title":"Serial over USB"},{"content":"Für das Seminar “Konzepte konkreter und abstrakter Maschinen” habe ich einen kleinen EBNF-Parser geschrieben, der die Korrektheit der EBNF-Syntax prüft und die Regeln verdeutscht. Der Parser wurde in Java innerhalb von kapp 2 Stunden entwickelt…\ndigit = ‘0’|’1’|’2′. hexdigit = digit|’A’|’B’|’C’|’D’|’E’|’F’. vorzeichen = ‘-‘|’+’. zahl = [vorzeichen] hexdigit {hexdigit}.\nWird zu:\ndigit = ‘0’ oder ‘1’ oder ‘2’ hexdigit = ‘digit’ oder ‘A’ oder ‘B’ oder ‘C’ oder ‘D’ oder ‘E’ oder ‘F’ vorzeichen = ‘-‘ oder ‘+’ zahl = entweder leer oder gleich ‘vorzeichen’ ‘hexdigit’ keinem, einem, oder mehreren ‘hexdigit’ EBNF check ok\nZweites Beispiel mit Fehler…\ndigit = ‘0’|’1’|’2′. hexdigit = zahl|’A’|’B’|’C’|’D’|’E’|’F’.\nwird zu…\ndigit = ‘0’ oder ‘1’ oder ‘2’ hexdigit = EBNF-Error: ‘zahl’ not defined – at line 2\n","permalink":"https://playground.christian-gmeiner.info/2007-11-28-ebnf/","summary":"\u003cp\u003eFür das Seminar “Konzepte konkreter und abstrakter Maschinen” habe ich einen kleinen \u003ca href=\"http://de.wikipedia.org/wiki/Erweiterte_Backus-Naur-Form\" title=\"EBNF@Wikipedia\"\u003eEBNF\u003c/a\u003e-Parser geschrieben, der die Korrektheit der EBNF-Syntax prüft und die Regeln verdeutscht. Der Parser wurde in Java innerhalb von kapp 2 Stunden entwickelt…\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003edigit = ‘0’|’1’|’2′.\nhexdigit = digit|’A’|’B’|’C’|’D’|’E’|’F’.\nvorzeichen = ‘-‘|’+’.\nzahl = [vorzeichen] hexdigit {hexdigit}.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWird zu:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003edigit = ‘0’ oder ‘1’ oder ‘2’\nhexdigit = ‘digit’ oder ‘A’ oder ‘B’ oder ‘C’ oder ‘D’ oder ‘E’ oder ‘F’\nvorzeichen = ‘-‘ oder ‘+’\nzahl = entweder leer oder gleich ‘vorzeichen’ ‘hexdigit’ keinem, einem, oder mehreren ‘hexdigit’\nEBNF check ok\u003c/p\u003e","title":"EBNF"},{"content":"Wer Gentoo verwendet oder sehr viel Code compilieren muss, sollte sich Gedanken machen wie man das Compileren beschleunigen könnte. Eine Lösung wäre die Verwendung eines Compile-Clusters. Ich habe mich hierbei für Icecream entschieden. Wie immer eine kleine Installationsanleitung für Gentoo 🙂\nemerge sys-devel/icecream rc-update add icecream default /etc/conf.d/icecream nach eigenen Wünschen bearbeiten* /etc/init.d/icecream start Diese Schritte auf allen Gentoo Maschienen durchführen, welche am Compile-Cluster teilhaben sollen.\nNachdem der Cluster nun einsatzbereit ist, muss nur noch /etc/make.conf und PATH angepasst werden, damit der Cluster verwendet werden kann.\nexport PATH=/usr/lib/icecc/bin/:$PATH PREROOTPATH=”/usr/lib/icecc/bin” in /etc/make.conf hinzufügen Nun wird bei jedem emerge der Cluster verwendet und auch bei normalen Compile-Aufgaben. Im Moment habe ich einen kleinen Compile-Cluster bestehend aus 3 Gentoo-Rechner…\nHappy Hacking…\nIm Compile-Cluster darf es nur einen Node mit ICECREAM_RUN_SCHEDULER=”yes” geben. ","permalink":"https://playground.christian-gmeiner.info/2007-11-01-icecream-lecker/","summary":"\u003cp\u003eWer \u003ca href=\"http://www.gentoo.org\" title=\"Gentoo Linux\"\u003eGentoo\u003c/a\u003e verwendet oder sehr viel Code compilieren muss, sollte sich Gedanken machen wie man das Compileren beschleunigen könnte. Eine Lösung wäre die Verwendung eines Compile-Clusters. Ich habe mich hierbei für \u003ca href=\"http://en.opensuse.org/Icecream\" title=\"Icecream\"\u003eIcecream\u003c/a\u003e entschieden. Wie immer eine kleine Installationsanleitung für Gentoo 🙂\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ch1 id=\"emerge-sys-develicecream\"\u003eemerge sys-devel/icecream\u003c/h1\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch1 id=\"rc-update-add-icecream-default\"\u003erc-update add icecream default\u003c/h1\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e/etc/conf.d/icecream\u003c/em\u003e nach eigenen Wünschen bearbeiten*\u003c/li\u003e\n\u003cli\u003e\n\u003ch1 id=\"etcinitdicecream-start\"\u003e/etc/init.d/icecream start\u003c/h1\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDiese Schritte auf allen Gentoo Maschienen durchführen, welche am Compile-Cluster teilhaben sollen.\u003c/p\u003e\n\u003cp\u003eNachdem der Cluster nun einsatzbereit ist, muss nur noch \u003cem\u003e/etc/make.conf\u003c/em\u003e und \u003cstrong\u003ePATH\u003c/strong\u003e angepasst werden, damit der Cluster verwendet werden kann.\u003c/p\u003e","title":"Icecream.. *lecker*"},{"content":"Suspend war und ist immer noch ein Knackpunkt von Linux. Doch zum Glück kann ich sagen, dass sich die Situation verbessert hat und nun ist es ohne Suspend2 Patches möglich mit einem aktuellen Kernel 2.6.23 Suspend2Ram und Supend2Disk zu verwendet. Nach einer schnellen Kernelconfig-Änderung und dem hinzufügen von resume=/dev/hda2zu den Boot-Pararmetern genügten schon um von Kernel-Seite alles bereitzustellen.\nJetzt fehlt nur noch der Userspace 🙂 Unter Gentoo reicht ein einfaches ***emerge sys-power/suspend ***und dem Supendieren steht nichts mehr im Weg. Unter KDE ist KPowersave sehr zu empfehlen.\n","permalink":"https://playground.christian-gmeiner.info/2007-10-28-schlaf-laptop-schlaf/","summary":"\u003cp\u003eSuspend war und ist immer noch ein Knackpunkt von Linux. Doch zum Glück kann ich sagen, dass sich die Situation verbessert hat und nun ist es ohne Suspend2 Patches möglich mit einem aktuellen Kernel 2.6.23 Suspend2Ram und Supend2Disk zu verwendet. Nach einer schnellen Kernelconfig-Änderung und dem hinzufügen von \u003cem\u003e\u003cstrong\u003eresume=/dev/hda2\u003c/strong\u003e\u003c/em\u003ezu den Boot-Pararmetern genügten schon um von Kernel-Seite alles bereitzustellen.\u003c/p\u003e\n\u003cp\u003eJetzt fehlt nur noch der Userspace 🙂 Unter Gentoo reicht ein  einfaches ***emerge sys-power/suspend ***und dem Supendieren steht nichts mehr im Weg. Unter KDE ist KPowersave sehr zu empfehlen.\u003c/p\u003e","title":"Schlaf Laptop schlaf..."},{"content":"Leider ist das offizielle Portage nicht immer up2date (sci-mathematics/octave-2.1.73-r2) und aus diesem Grund hier nun der einfachste Weg zu octave 2.9 unter Gentoo.\n# emerge layman # layman -a science # echo “source /usr/portage/local/layman/make.conf” \u0026raquo; /etc/make.conf # emerge -av octave These are the packages that would be merged, in order:\nCalculating dependencies… done! [ebuild N ] app-admin/eselect-blas-0.1 0 kB [ebuild N ] sci-mathematics/glpk-4.22 USE=”-doc” 1,385 kB [ebuild N ] app-admin/eselect-lapack-0.1 0 kB [ebuild N ] dev-tcltk/expect-5.43.0 USE=”X -doc” 514 kB [ebuild N ] dev-util/gperf-3.0.3 845 kB [ebuild N ] sci-libs/blas-reference-20070226 USE=”-debug -doc” 5,208 kB [ebuild N ] dev-util/dejagnu-1.4.4-r1 USE=”-doc” 1,056 kB [ebuild N ] virtual/blas-1.0 0 kB [1] [ebuild N ] sci-libs/lapack-reference-3.1.1-r1 USE=”-debug -doc” 0 kB [ebuild N ] virtual/lapack-1.0 0 kB [1] [ebuild N ] sci-mathematics/octave-2.9.14 USE=”readline -curl -debug -doc -emacs -hdf5 -zlib” 9,185 kB [1]\nTotal: 11 packages (11 new), Size of downloads: 18,190 kB Portage tree and overlays: [0] /usr/portage [1] /usr/portage/local/layman/science\nWould you like to merge these packages? [Yes/No]\n","permalink":"https://playground.christian-gmeiner.info/2007-10-07-octave-29-mit-gentoo/","summary":"\u003cp\u003eLeider ist das offizielle Portage nicht immer up2date (\u003cstrong\u003esci-mathematics/octave-2.1.73-r2\u003c/strong\u003e) und aus diesem Grund hier nun der einfachste Weg zu octave 2.9 unter Gentoo.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cem\u003e# emerge layman\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e# layman -a science\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e# echo “source /usr/portage/local/layman/make.conf” \u0026raquo; /etc/make.conf\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e# emerge -av octave\u003c/em\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThese are the packages that would be merged, in order:\u003c/p\u003e\n\u003cp\u003eCalculating dependencies… done!\n[ebuild N ] app-admin/eselect-blas-0.1 0 kB\n[ebuild N ] sci-mathematics/glpk-4.22 USE=”-doc” 1,385 kB\n[ebuild N ] app-admin/eselect-lapack-0.1 0 kB\n[ebuild N ] dev-tcltk/expect-5.43.0 USE=”X -doc” 514 kB\n[ebuild N ] dev-util/gperf-3.0.3 845 kB\n[ebuild N ] sci-libs/blas-reference-20070226 USE=”-debug -doc” 5,208 kB\n[ebuild N ] dev-util/dejagnu-1.4.4-r1 USE=”-doc” 1,056 kB\n[ebuild N ] virtual/blas-1.0 0 kB [1]\n[ebuild N ] sci-libs/lapack-reference-3.1.1-r1 USE=”-debug -doc” 0 kB\n[ebuild N ] virtual/lapack-1.0 0 kB [1]\n[ebuild N ] \u003cstrong\u003esci-mathematics/octave-2.9.14\u003c/strong\u003e USE=”readline -curl -debug -doc -emacs -hdf5 -zlib” 9,185 kB [1]\u003c/p\u003e","title":"Octave 2.9 mit Gentoo"},{"content":"Nachdem ich im Moment ein paar kleine Patches für Wine beisteuern will, möchte ich natürlich meine Änderungen auf einem Windows-System testen. Hierfür bietet Wine ein make crosstest an. Doch damit dies unter Gentoo funktioniert, muss man folgendes ausführen:\n# emerge crossdev \u0026amp;\u0026amp; crossdev i386-mingw32\nDanach muss man nur noch ./configure \u0026amp;\u0026amp; make crosstest im Wine-Verzeichnis ausführen und man bekommt Binaries für Windows. Happy Hacking\n","permalink":"https://playground.christian-gmeiner.info/2007-09-26-wine-crosstests-erstellen/","summary":"\u003cp\u003eNachdem ich im Moment ein paar kleine Patches für Wine beisteuern will, möchte ich natürlich meine Änderungen auf einem Windows-System testen. Hierfür bietet Wine ein \u003cstrong\u003emake crosstest\u003c/strong\u003e an. Doch damit dies unter Gentoo funktioniert, muss man folgendes ausführen:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# emerge crossdev \u0026amp;\u0026amp; crossdev i386-mingw32\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDanach muss man nur noch \u003cstrong\u003e./configure \u0026amp;\u0026amp; make crosstest\u003c/strong\u003e im Wine-Verzeichnis ausführen und man bekommt Binaries für Windows.\nHappy Hacking\u003c/p\u003e","title":"Wine Crosstests erstellen"},{"content":"Dies ist mein erneuter Versuchen einen Blog auf Beine zu stellen. Hier werde ich ausschließlich über mein Leben als Informatiker schreiben, über meine Arbeit als Open Source Entwickler und evt ein wenig über mein Studium.\nHappy Reading\n","permalink":"https://playground.christian-gmeiner.info/2007-09-18-chaos-computing/","summary":"\u003cp\u003eDies ist mein erneuter Versuchen einen Blog auf Beine zu stellen. Hier werde ich ausschließlich über mein Leben als Informatiker schreiben, über meine Arbeit als Open Source Entwickler und evt ein wenig über mein Studium.\u003c/p\u003e\n\u003cp\u003eHappy Reading\u003c/p\u003e","title":"Chaos Computing..."},{"content":"Software inevitably encounters bugs, a challenge particularly pronounced in the Free Software domain where much of the development relies on volunteers. Sometimes, even important bugs might not be addressed in time for a software release.\nIn scenarios where crucial bugs are left unresolved, possibly due to the voluntary nature of the contributors, users often find themselves in need of a solution, even if they are willing to pay for it.\nThis is where my services come into play. I offer professional consulting for both bug fixing and the development of new features. If you are facing a persistent bug or looking to add a new feature to your software, I am here to assist.\nUpon your request, I will evaluate the bug or feature concept, estimate the time and effort needed to tackle it, and provide you with a comprehensive proposal. The only requirement from my end is that the bug is reproducible to ensure effective resolution.\nMy services are geared towards delivering high-quality solutions in software consulting. Whether it\u0026rsquo;s ironing out complex bugs or crafting innovative features, I am ready to take on the challenge.\nIf you have any critical bugs or feature ideas you\u0026rsquo;d like to discuss, please feel free to contact me. Let\u0026rsquo;s collaborate to elevate your software to the next level.\n","permalink":"https://playground.christian-gmeiner.info/consulting/","summary":"\u003cp\u003eSoftware inevitably encounters bugs, a challenge particularly pronounced in the Free Software domain where much of the development relies on volunteers. Sometimes, even important bugs might not be addressed in time for a software release.\u003c/p\u003e\n\u003cp\u003eIn scenarios where crucial bugs are left unresolved, possibly due to the voluntary nature of the contributors, users often find themselves in need of a solution, even if they are willing to pay for it.\u003c/p\u003e","title":"Consulting"},{"content":"Follow me, @johndoe.\n","permalink":"https://playground.christian-gmeiner.info/contact/","summary":"\u003cp\u003eFollow me, @johndoe.\u003c/p\u003e","title":"Contact"},{"content":"1. Datenschutz auf einen Blick Allgemeine Hinweise Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz entnehmen Sie unserer unter diesem Text aufgeführten Datenschutzerklärung.\nDatenerfassung auf dieser Website Wer ist verantwortlich für die Datenerfassung auf dieser Website? Die Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten können Sie dem Abschnitt „Hinweis zur Verantwortlichen Stelle“ in dieser Datenschutzerklärung entnehmen.\nWie erfassen wir Ihre Daten? Ihre Daten werden zum einen dadurch erhoben, dass Sie uns diese mitteilen. Hierbei kann es sich z. B. um Daten handeln, die Sie in ein Kontaktformular eingeben.\nAndere Daten werden automatisch oder nach Ihrer Einwilligung beim Besuch der Website durch unsere IT-Systeme erfasst. Das sind vor allem technische Daten (z. B. Internetbrowser, Betriebssystem oder Uhrzeit des Seitenaufrufs). Die Erfassung dieser Daten erfolgt automatisch, sobald Sie diese Website betreten.\nWofür nutzen wir Ihre Daten? Ein Teil der Daten wird erhoben, um eine fehlerfreie Bereitstellung der Website zu gewährleisten. Andere Daten können zur Analyse Ihres Nutzerverhaltens verwendet werden.\nWelche Rechte haben Sie bezüglich Ihrer Daten? Sie haben jederzeit das Recht, unentgeltlich Auskunft über Herkunft, Empfänger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten. Sie haben außerdem ein Recht, die Berichtigung oder Löschung dieser Daten zu verlangen. Wenn Sie eine Einwilligung zur Datenverarbeitung erteilt haben, können Sie diese Einwilligung jederzeit für die Zukunft widerrufen. Außerdem haben Sie das Recht, unter bestimmten Umständen die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Des Weiteren steht Ihnen ein Beschwerderecht bei der zuständigen Aufsichtsbehörde zu.\nHierzu sowie zu weiteren Fragen zum Thema Datenschutz können Sie sich jederzeit an uns wenden.\n2. Hosting Wir hosten die Inhalte unserer Website bei folgendem Anbieter:\nExternes Hosting Diese Website wird extern gehostet. Die personenbezogenen Daten, die auf dieser Website erfasst werden, werden auf den Servern des Hosters / der Hoster gespeichert. Hierbei kann es sich v. a. um IP-Adressen, Kontaktanfragen, Meta- und Kommunikationsdaten, Vertragsdaten, Kontaktdaten, Namen, Websitezugriffe und sonstige Daten, die über eine Website generiert werden, handeln.\nDas externe Hosting erfolgt zum Zwecke der Vertragserfüllung gegenüber unseren potenziellen und bestehenden Kunden (Art. 6 Abs. 1 lit. b DSGVO) und im Interesse einer sicheren, schnellen und effizienten Bereitstellung unseres Online-Angebots durch einen professionellen Anbieter (Art. 6 Abs. 1 lit. f DSGVO). Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endgerät des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.\nUnser(e) Hoster wird bzw. werden Ihre Daten nur insoweit verarbeiten, wie dies zur Erfüllung seiner Leistungspflichten erforderlich ist und unsere Weisungen in Bezug auf diese Daten befolgen.\nWir setzen folgende(n) Hoster ein:\nUberspace\nKaiserstr. 15\n55116 Mainz\n3. Allgemeine Hinweise und Pflicht­informationen Datenschutz Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend den gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.\nWenn Sie diese Website benutzen, werden verschiedene personenbezogene Daten erhoben. Personenbezogene Daten sind Daten, mit denen Sie persönlich identifiziert werden können. Die vorliegende Datenschutzerklärung erläutert, welche Daten wir erheben und wofür wir sie nutzen. Sie erläutert auch, wie und zu welchem Zweck das geschieht.\nWir weisen darauf hin, dass die Datenübertragung im Internet (z. B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.\nHinweis zur verantwortlichen Stelle Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:\nChristian Gmeiner\nSperberweg 18\n6971 Hard\nÖsterreich\nE-Mail: office@christian-gmeiner.info\nVerantwortliche Stelle ist die natürliche oder juristische Person, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten (z. B. Namen, E-Mail- Adressen o. Ä.) entscheidet.\nSpeicherdauer Soweit innerhalb dieser Datenschutzerklärung keine speziellere Speicherdauer genannt wurde, verbleiben Ihre personenbezogenen Daten bei uns, bis der Zweck für die Datenverarbeitung entfällt. Wenn Sie ein berechtigtes Löschersuchen geltend machen oder eine Einwilligung zur Datenverarbeitung widerrufen, werden Ihre Daten gelöscht, sofern wir keine anderen rechtlich zulässigen Gründe für die Speicherung Ihrer personenbezogenen Daten haben (z. B. steuer- oder handelsrechtliche Aufbewahrungsfristen); im letztgenannten Fall erfolgt die Löschung nach Fortfall dieser Gründe.\nAllgemeine Hinweise zu den Rechtsgrundlagen der Datenverarbeitung auf dieser Website Sofern Sie in die Datenverarbeitung eingewilligt haben, verarbeiten wir Ihre personenbezogenen Daten auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO bzw. Art. 9 Abs. 2 lit. a DSGVO, sofern besondere Datenkategorien nach Art. 9 Abs. 1 DSGVO verarbeitet werden. Im Falle einer ausdrücklichen Einwilligung in die Übertragung personenbezogener Daten in Drittstaaten erfolgt die Datenverarbeitung außerdem auf Grundlage von Art. 49 Abs. 1 lit. a DSGVO. Sofern Sie in die Speicherung von Cookies oder in den Zugriff auf Informationen in Ihr Endgerät (z. B. via Device-Fingerprinting) eingewilligt haben, erfolgt die Datenverarbeitung zusätzlich auf Grundlage von § 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Sind Ihre Daten zur Vertragserfüllung oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, verarbeiten wir Ihre Daten auf Grundlage des Art. 6 Abs. 1 lit. b DSGVO. Des Weiteren verarbeiten wir Ihre Daten, sofern diese zur Erfüllung einer rechtlichen Verpflichtung erforderlich sind auf Grundlage von Art. 6 Abs. 1 lit. c DSGVO. Die Datenverarbeitung kann ferner auf Grundlage unseres berechtigten Interesses nach Art. 6 Abs. 1 lit. f DSGVO erfolgen. Über die jeweils im Einzelfall einschlägigen Rechtsgrundlagen wird in den folgenden Absätzen dieser Datenschutzerklärung informiert.\nEmpfänger von personenbezogenen Daten Im Rahmen unserer Geschäftstätigkeit arbeiten wir mit verschiedenen externen Stellen zusammen. Dabei ist teilweise auch eine Übermittlung von personenbezogenen Daten an diese externen Stellen erforderlich. Wir geben personenbezogene Daten nur dann an externe Stellen weiter, wenn dies im Rahmen einer Vertragserfüllung erforderlich ist, wenn wir gesetzlich hierzu verpflichtet sind (z. B. Weitergabe von Daten an Steuerbehörden), wenn wir ein berechtigtes Interesse nach Art. 6 Abs. 1 lit. f DSGVO an der Weitergabe haben oder wenn eine sonstige Rechtsgrundlage die Datenweitergabe erlaubt. Beim Einsatz von Auftragsverarbeitern geben wir personenbezogene Daten unserer Kunden nur auf Grundlage eines gültigen Vertrags über Auftragsverarbeitung weiter. Im Falle einer gemeinsamen Verarbeitung wird ein Vertrag über gemeinsame Verarbeitung geschlossen.\nWiderruf Ihrer Einwilligung zur Datenverarbeitung Viele Datenverarbeitungsvorgänge sind nur mit Ihrer ausdrücklichen Einwilligung möglich. Sie können eine bereits erteilte Einwilligung jederzeit widerrufen. Die Rechtmäßigkeit der bis zum Widerruf erfolgten Datenverarbeitung bleibt vom Widerruf unberührt.\nWiderspruchsrecht gegen die Datenerhebung in besonderen Fällen sowie gegen Direktwerbung (Art. 21 DSGVO) WENN DIE DATENVERARBEITUNG AUF GRUNDLAGE VON ART. 6 ABS. 1 LIT. E ODER F DSGVO ERFOLGT, HABEN SIE JEDERZEIT DAS RECHT, AUS GRÜNDEN, DIE SICH AUS IHRER BESONDEREN SITUATION ERGEBEN, GEGEN DIE VERARBEITUNG IHRER PERSONENBEZOGENEN DATEN WIDERSPRUCH EINZULEGEN; DIES GILT AUCH FÜR EIN AUF DIESE BESTIMMUNGEN GESTÜTZTES PROFILING. DIE JEWEILIGE RECHTSGRUNDLAGE, AUF DENEN EINE VERARBEITUNG BERUHT, ENTNEHMEN SIE DIESER DATENSCHUTZERKLÄRUNG. WENN SIE WIDERSPRUCH EINLEGEN, WERDEN WIR IHRE BETROFFENEN PERSONENBEZOGENEN DATEN NICHT MEHR VERARBEITEN, ES SEI DENN, WIR KÖNNEN ZWINGENDE SCHUTZWÜRDIGE GRÜNDE FÜR DIE VERARBEITUNG NACHWEISEN, DIE IHRE INTERESSEN, RECHTE UND FREIHEITEN ÜBERWIEGEN ODER DIE VERARBEITUNG DIENT DER GELTENDMACHUNG, AUSÜBUNG ODER VERTEIDIGUNG VON RECHTSANSPRÜCHEN (WIDERSPRUCH NACH ART. 21 ABS. 1 DSGVO).\nWERDEN IHRE PERSONENBEZOGENEN DATEN VERARBEITET, UM DIREKTWERBUNG ZU BETREIBEN, SO HABEN SIE DAS RECHT, JEDERZEIT WIDERSPRUCH GEGEN DIE VERARBEITUNG SIE BETREFFENDER PERSONENBEZOGENER DATEN ZUM ZWECKE DERARTIGER WERBUNG EINZULEGEN; DIES GILT AUCH FÜR DAS PROFILING, SOWEIT ES MIT SOLCHER DIREKTWERBUNG IN VERBINDUNG STEHT. WENN SIE WIDERSPRECHEN, WERDEN IHRE PERSONENBEZOGENEN DATEN ANSCHLIESSEND NICHT MEHR ZUM ZWECKE DER DIREKTWERBUNG VERWENDET (WIDERSPRUCH NACH ART. 21 ABS. 2 DSGVO).\nBeschwerde­recht bei der zuständigen Aufsichts­behörde Im Falle von Verstößen gegen die DSGVO steht den Betroffenen ein Beschwerderecht bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat ihres gewöhnlichen Aufenthalts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes zu. Das Beschwerderecht besteht unbeschadet anderweitiger verwaltungsrechtlicher oder gerichtlicher Rechtsbehelfe.\nRecht auf Daten­übertrag­barkeit Sie haben das Recht, Daten, die wir auf Grundlage Ihrer Einwilligung oder in Erfüllung eines Vertrags automatisiert verarbeiten, an sich oder an einen Dritten in einem gängigen, maschinenlesbaren Format aushändigen zu lassen. Sofern Sie die direkte Übertragung der Daten an einen anderen Verantwortlichen verlangen, erfolgt dies nur, soweit es technisch machbar ist.\nAuskunft, Berichtigung und Löschung Sie haben im Rahmen der geltenden gesetzlichen Bestimmungen jederzeit das Recht auf unentgeltliche Auskunft über Ihre gespeicherten personenbezogenen Daten, deren Herkunft und Empfänger und den Zweck der Datenverarbeitung und ggf. ein Recht auf Berichtigung oder Löschung dieser Daten. Hierzu sowie zu weiteren Fragen zum Thema personenbezogene Daten können Sie sich jederzeit an uns wenden.\nRecht auf Einschränkung der Verarbeitung Sie haben das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Hierzu können Sie sich jederzeit an uns wenden. Das Recht auf Einschränkung der Verarbeitung besteht in folgenden Fällen:\nWenn Sie die Richtigkeit Ihrer bei uns gespeicherten personenbezogenen Daten bestreiten, benötigen wir in der Regel Zeit, um dies zu überprüfen. Für die Dauer der Prüfung haben Sie das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Wenn die Verarbeitung Ihrer personenbezogenen Daten unrechtmäßig geschah/geschieht, können Sie statt der Löschung die Einschränkung der Datenverarbeitung verlangen. Wenn wir Ihre personenbezogenen Daten nicht mehr benötigen, Sie sie jedoch zur Ausübung, Verteidigung oder Geltendmachung von Rechtsansprüchen benötigen, haben Sie das Recht, statt der Löschung die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Wenn Sie einen Widerspruch nach Art. 21 Abs. 1 DSGVO eingelegt haben, muss eine Abwägung zwischen Ihren und unseren Interessen vorgenommen werden. Solange noch nicht feststeht, wessen Interessen überwiegen, haben Sie das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Wenn Sie die Verarbeitung Ihrer personenbezogenen Daten eingeschränkt haben, dürfen diese Daten – von ihrer Speicherung abgesehen – nur mit Ihrer Einwilligung oder zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der Rechte einer anderen natürlichen oder juristischen Person oder aus Gründen eines wichtigen öffentlichen Interesses der Europäischen Union oder eines Mitgliedstaats verarbeitet werden.\nSSL- bzw. TLS-Verschlüsselung Diese Seite nutzt aus Sicherheitsgründen und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel Bestellungen oder Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL- bzw. TLS-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://“ auf „https://“ wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.\nWenn die SSL- bzw. TLS-Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.\nWiderspruch gegen Werbe-E-Mails Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-E-Mails, vor.\n4. Datenerfassung auf dieser Website Server-Log-Dateien Der Provider der Seiten erhebt und speichert automatisch Informationen in so genannten Server-Log-Dateien, die Ihr Browser automatisch an uns übermittelt. Dies sind:\nBrowsertyp und Browserversion verwendetes Betriebssystem Referrer URL Hostname des zugreifenden Rechners Uhrzeit der Serveranfrage IP-Adresse Eine Zusammenführung dieser Daten mit anderen Datenquellen wird nicht vorgenommen.\nDie Erfassung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiber hat ein berechtigtes Interesse an der technisch fehlerfreien Darstellung und der Optimierung seiner Website – hierzu müssen die Server-Log-Files erfasst werden.\nAnfrage per E-Mail, Telefon oder Telefax Wenn Sie uns per E-Mail, Telefon oder Telefax kontaktieren, wird Ihre Anfrage inklusive aller daraus hervorgehenden personenbezogenen Daten (Name, Anfrage) zum Zwecke der Bearbeitung Ihres Anliegens bei uns gespeichert und verarbeitet. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.\nDie Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erfüllung eines Vertrags zusammenhängt oder zur Durchführung vorvertraglicher Maßnahmen erforderlich ist. In allen übrigen Fällen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) sofern diese abgefragt wurde; die Einwilligung ist jederzeit widerrufbar.\nDie von Ihnen an uns per Kontaktanfragen übersandten Daten verbleiben bei uns, bis Sie uns zur Löschung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck für die Datenspeicherung entfällt (z. B. nach abgeschlossener Bearbeitung Ihres Anliegens). Zwingende gesetzliche Bestimmungen – insbesondere gesetzliche Aufbewahrungsfristen – bleiben unberührt.\n5. Plugins und Tools YouTube mit erweitertem Datenschutz Diese Website bindet Videos der Website YouTube ein. Betreiber der Seiten ist die Google Ireland Limited („Google“), Gordon House, Barrow Street, Dublin 4, Irland.\nWir nutzen YouTube im erweiterten Datenschutzmodus. Dieser Modus bewirkt laut YouTube, dass YouTube keine Informationen über die Besucher auf dieser Website speichert, bevor diese sich das Video ansehen. Die Weitergabe von Daten an YouTube-Partner wird durch den erweiterten Datenschutzmodus hingegen nicht zwingend ausgeschlossen. So stellt YouTube – unabhängig davon, ob Sie sich ein Video ansehen – eine Verbindung zum Google Marketing Netzwerk her.\nSobald Sie ein YouTube-Video auf dieser Website starten, wird eine Verbindung zu den Servern von YouTube hergestellt. Dabei wird dem YouTube-Server mitgeteilt, welche unserer Seiten Sie besucht haben. Wenn Sie in Ihrem YouTube-Account eingeloggt sind, ermöglichen Sie YouTube, Ihr Surfverhalten direkt Ihrem persönlichen Profil zuzuordnen. Dies können Sie verhindern, indem Sie sich aus Ihrem YouTube-Account ausloggen.\nDes Weiteren kann YouTube nach Starten eines Videos verschiedene Cookies auf Ihrem Endgerät speichern oder vergleichbare Wiedererkennungstechnologien (z. B. Device-Fingerprinting) einsetzen. Auf diese Weise kann YouTube Informationen über Besucher dieser Website erhalten. Diese Informationen werden u. a. verwendet, um Videostatistiken zu erfassen, die Anwenderfreundlichkeit zu verbessern und Betrugsversuchen vorzubeugen.\nGegebenenfalls können nach dem Start eines YouTube-Videos weitere Datenverarbeitungsvorgänge ausgelöst werden, auf die wir keinen Einfluss haben.\nDie Nutzung von YouTube erfolgt im Interesse einer ansprechenden Darstellung unserer Online-Angebote. Dies stellt ein berechtigtes Interesse im Sinne von Art. 6 Abs. 1 lit. f DSGVO dar. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endgerät des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.\nWeitere Informationen über Datenschutz bei YouTube finden Sie in deren Datenschutzerklärung unter: https://policies.google.com/privacy?hl=de.\nDas Unternehmen verfügt über eine Zertifizierung nach dem „EU-US Data Privacy Framework“ (DPF). Der DPF ist ein Übereinkommen zwischen der Europäischen Union und den USA, der die Einhaltung europäischer Datenschutzstandards bei Datenverarbeitungen in den USA gewährleisten soll. Jedes nach dem DPF zertifizierte Unternehmen verpflichtet sich, diese Datenschutzstandards einzuhalten. Weitere Informationen hierzu erhalten Sie vom Anbieter unter folgendem Link: [https:/ /www.dataprivacyframework.gov/s/participant-search/participant- detail?contact=true\u0026amp;id=a2zt000000001L5AAI\u0026amp;status=Active](https://www.dataprivacyframework.gov/s/participant-search/participant- detail?contact=true\u0026amp;id=a2zt000000001L5AAI\u0026amp;status=Active)\nQuelle: https://www.e-recht24.de\n","permalink":"https://playground.christian-gmeiner.info/privacypolicy/","summary":"\u003ch2 id=\"1-datenschutz-auf-einen-blick\"\u003e1. Datenschutz auf einen Blick\u003c/h2\u003e\n\u003ch3 id=\"allgemeine-hinweise\"\u003eAllgemeine Hinweise\u003c/h3\u003e\n\u003cp\u003eDie folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz entnehmen Sie unserer unter diesem Text aufgeführten Datenschutzerklärung.\u003c/p\u003e\n\u003ch3 id=\"datenerfassung-auf-dieser-website\"\u003eDatenerfassung auf dieser Website\u003c/h3\u003e\n\u003ch4 id=\"wer-ist-verantwortlich-für-die-datenerfassung-auf-dieser-website\"\u003eWer ist verantwortlich für die Datenerfassung auf dieser Website?\u003c/h4\u003e\n\u003cp\u003eDie Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten können Sie dem Abschnitt „Hinweis zur Verantwortlichen Stelle“ in dieser Datenschutzerklärung entnehmen.\u003c/p\u003e","title":"Datenschutz­erklärung"},{"content":"Christian Gmeiner\nSperberwerg 18\n6971 Hard\nAustria\nTel: \u0026#32;\u0026#32; E-Mail: \u0026#32;\u0026#32; Internet: www.christian-gmeiner.info\nUnternehmensgegenstand: Dienstleistungen in der automatischen Datenverarbeitung und Informationstechnik\nUID-Nummer: ATU79378834\nFirmengericht: Landesgericht Feldkirch Mitglied der WKÖ Vorarlberg\nBerufsrecht: Gewerbeordnung abrufbar unter: www.ris.bka.gv.at\nGewerbebehörde: Bezirkshauptmannschaft Dornbirn\nBerufsbezeichnung: Freies Gewerbe\n","permalink":"https://playground.christian-gmeiner.info/imprint/","summary":"\u003cp\u003eChristian Gmeiner\u003cbr\u003e\nSperberwerg 18\u003cbr\u003e\n6971 Hard\u003cbr\u003e\nAustria\u003cbr\u003e\u003c/p\u003e\n\u003cp\u003eTel: \n\u003cstyle\u003e\n  #span-949f3ff4.cloaked-e-mail:before {\n    content:attr(data-user);\n    unicode-bidi:bidi-override;\n    direction:rtl;\n  }\n\u003c/style\u003e\n\u0026#32;\u003cspan class=\"cloaked-e-mail\" data-user=\"999306108634\u0026#43;\" id=\"span-949f3ff4\"\u003e\u003c/span\u003e\u0026#32;\n\n\u003cscript id=\"script-949f3ff4\"\u003e\n  var scriptTag = document.getElementById(\"script-949f3ff4\");\n  var link = document.createElement(\"a\");\n  var address = \"999306108634\\u002b\".split('').reverse().join('');\n  link.href = \"tel\" + \":\" + address;\n  link.innerText = address.split('?')[0];\n  scriptTag.parentElement.insertBefore(link, scriptTag.previousElementSibling);\n  scriptTag.parentElement.removeChild(scriptTag.previousElementSibling)\n\u003c/script\u003e\n\n\u003cbr\u003e\nE-Mail: \n\u003cstyle\u003e\n  #span-b6b08231.cloaked-e-mail:before {\n    content:attr(data-domain) \"\\0040\" attr(data-user);\n    unicode-bidi:bidi-override;\n    direction:rtl;\n  }\n\u003c/style\u003e\n\u0026#32;\u003cspan class=\"cloaked-e-mail\" data-user=\"eciffo\" data-domain=\"ofni.reniemg-naitsirhc\" id=\"span-b6b08231\"\u003e\u003c/span\u003e\u0026#32;\n\n\u003cscript id=\"script-b6b08231\"\u003e\n  var scriptTag = document.getElementById(\"script-b6b08231\");\n  var link = document.createElement(\"a\");\n  var address = \"eciffo\".split('').reverse().join('') + \"@\" + \"ofni.reniemg-naitsirhc\".split('').reverse().join('');\n  link.href = \"mailto\" + \":\" + address;\n  link.innerText = address.split('?')[0];\n  scriptTag.parentElement.insertBefore(link, scriptTag.previousElementSibling);\n  scriptTag.parentElement.removeChild(scriptTag.previousElementSibling)\n\u003c/script\u003e\n\n\u003cbr\u003e\nInternet: \u003ca href=\"https://www.christian-gmeiner.info\"\u003ewww.christian-gmeiner.info\u003c/a\u003e\u003cbr\u003e\u003c/p\u003e","title":"Imprint"}]